使用 TaskCompletionSource.TrySetResult() 时出错



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

以下是代码(@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);
stuff.LoadCompleted += (sender, args) => tcs.TrySetResult(args.Result);

这应该可以解决您的问题

如果你看一下EventHandler<T>定义,你会发现它需要两个参数

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

所以你需要在你的赋值中传递两个参数

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

相关内容

  • 没有找到相关文章

最新更新