首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TaskCompletionSource.TrySetResult()出错

使用TaskCompletionSource.TrySetResult()出错
EN

Stack Overflow用户
提问于 2014-01-06 16:58:32
回答 3查看 503关注 0票数 2

这是另一个这样的问题关于异步回调函数上使用异步包装器的后续问题。

下面是现有的代码(@Servy提供的一个很好的解决方案):

代码语言:javascript
复制
static Task<ObservableCollection<MyResult>> GetMyDataAsync(Params p)
{
    var tcs = new TaskCompletionSource<ObservableCollection<MyResult>>();
    DoStuffClass stuff = new DoStuffClass();
    stuff.LoadCompleted += (args) => tcs.TrySetResult(args.Result);
    stuff.LongDrawOutProcessAsync(p);
    return tcs.Task;
}

因此,我的问题是LoadCompleted事件;下面是签名:

代码语言:javascript
复制
public event EventHandler<MyArgs> LoadCompleted;

MyArgs包含一个名为ResultCollection的属性;但是,像这样更改代码不起作用:

代码语言:javascript
复制
    stuff.LoadCompleted += (args) => tcs.TrySetResult(args.ResultCollection);

实际上,我得到了一个错误:

代码语言:javascript
复制
'System.EventHandler<MyArgs>' does not take 1 arguments

我可以从签名中看出是否正确;那么如何将LoadCompleted结果设置为TaskCompletionSource

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-06 17:00:20

EventHandler需要两个参数,第一个是引发事件的实例,第二个是事件参数。即使您只使用一个(args),也需要同时指定它们。这应该是可行的:

代码语言:javascript
复制
stuff.LoadCompleted += (sender, args) => tcs.TrySetResult(args.Result);
票数 3
EN

Stack Overflow用户

发布于 2014-01-06 17:02:11

代码语言:javascript
复制
stuff.LoadCompleted += (sender, args) => tcs.TrySetResult(args.Result);

这应该能解决你的问题

票数 2
EN

Stack Overflow用户

发布于 2014-01-06 17:04:12

如果您查看EventHandler<T>定义,您将看到它需要两个参数

代码语言:javascript
复制
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

所以你需要在作业中传递两个参数

代码语言:javascript
复制
stuff.LoadCompleted += (sender, args) => tcs.TrySetResult(args.Result);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20955125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档