c# - 使用 TaskCompletionSource.TrySetResult() 时出错

标签 c# .net asynchronous arguments

这是 another SO question 的后续问题关于在异步回调函数上使用异步包装器。

这是目前的代码(@Servy 提供的优秀解决方案):

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 事件;这是签名:

public event EventHandler<MyArgs> LoadCompleted;

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

    stuff.LoadCompleted += (args) => tcs.TrySetResult(args.ResultCollection);

事实上,我得到了错误:

'System.EventHandler<MyArgs>' does not take 1 arguments

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

最佳答案

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

stuff.LoadCompleted += (sender, args) => tcs.TrySetResult(args.Result);

关于c# - 使用 TaskCompletionSource.TrySetResult() 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20955125/

相关文章:

c# - 防止 setter 在使用 Newtonsoft JSON.NET 反序列化时重新运行操作

c# - yield return 和 LINQ Select 的不同结果

c# - Asp.Net C# 调用单个验证器

c# 在父级返回时在后台运行异步任务

c# - 在 SharePoint 2010 中,如何在运行时添加用户选择的 WebPart?

c# - 用于检查值是否为空或等于的 Lambda 表达式

c# - 通过编写 C dll 来加速 C# 中的数学代码?

c# 将 LINQ var 结果转换为实际类型

asynchronous - Julia:在多个 GPU 上进行并行 CUSPARSE 计算

java - 异步 HTTP 请求与新线程上的 HTTP 请求