gpt4 book ai didi

c# - 在哪里为基于任务的异步方法定义回调

转载 作者:IT王子 更新时间:2023-10-29 03:54:05 26 4
gpt4 key购买 nike

正在关注 this question ,我正在尝试使用 TPL 实现异步方法,并尝试遵循 TAP 指南。

我希望我的异步方法在完成时执行回调。据我所知,我可以通过三种方式做到这一点。

1) 在我的任务委托(delegate)中手动回调

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback)
{
return Task.Factory.StartNew(
{
//do work

//call callback manually
completedCallback();
});
}

2) 在任务委托(delegate)中为任务分配回调

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback)
{
return Task.Factory.StartNew(
{
//do work
}
).ContinueWith(completedCallback); //assign callback to Task
}

3) 将回调分配给调用者中的任务

public Task DoWorkAsync()
{
return Task.Factory.StartNew(
{
//do work
});
}

public void SomeClientCode()
{
Task doingWork = DoWorkAsync();
doingWork.ContinueWith(OnWorkCompleted);
}

我的直觉是 3 更正确,因为它将回调与方法分离,并且意味着客户端代码可以以它认为合适的任何方式管理任务(使用回调、轮询等),这似乎是 Tasks都是关于。但是,如果 DoWorkAsync() 在客户端代码挂接其回调之前完成其工作,会发生什么情况?

是否有一种普遍接受的方法来做到这一点,还是它太新了?

2) 比 1) 有什么优势吗?

最佳答案

普遍接受的方式是3。

TPL 的用户通常知道他们可以使用 ContinueWith 继续任务。 1 和 2 提供相同的功能,但具有非标准接口(interface);用户必须弄清楚委托(delegate)参数的含义以及要传递的内容,例如如果他们不想继续 - 所有这一切,同时该方法仍然返回一个可以以标准方式继续的任务。

关于c# - 在哪里为基于任务的异步方法定义回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8244428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com