C# 是否有方法发出System.Threading.Tasks.Task已完成的信号?
我有一个图书馆,它是许多网络连接的复杂仲裁者。它的主要对象的每个方法都接受一个委托,当网络响应给定的请求时调用该委托 我想将我的库转换为使用新的.NET4.5“async/await”模式;这将需要我返回一个“Task”对象,它将向用户发出调用的异步部分已完成的信号。创建这个对象需要任务表示一个函数——据我所知,它本质上是一个轻量级线程 这并不符合我的库的设计——我希望任务的行为更像一个事件,并直接向用户发出他们的请求已完成的信号,而不是表示一个函数。这可能吗?我是否应该避免以这种方式滥用“异步/等待”模式 我不知道我的措辞是否恰当,我希望你理解我的意思。谢谢你的帮助 我想将我的库转换为使用新的.NET4.5“async/await”模式;这将需要我返回一个“Task”对象,它将向用户发出调用的异步部分已完成的信号 当然,不是这样-您可以返回实现等待模式的任何内容-但是C# 是否有方法发出System.Threading.Tasks.Task已完成的信号?,c#,.net,C#,.net,我有一个图书馆,它是许多网络连接的复杂仲裁者。它的主要对象的每个方法都接受一个委托,当网络响应给定的请求时调用该委托 我想将我的库转换为使用新的.NET4.5“async/await”模式;这将需要我返回一个“Task”对象,它将向用户发出调用的异步部分已完成的信号。创建这个对象需要任务表示一个函数——据我所知,它本质上是一个轻量级线程 这并不符合我的库的设计——我希望任务的行为更像一个事件,并直接向用户发出他们的请求已完成的信号,而不是表示一个函数。这可能吗?我是否应该避免以这种方式滥用“异步
任务
是最简单的方法
这并不符合我的库的设计——我希望任务的行为更像一个事件,并直接向用户发出他们的请求已完成的信号,而不是表示一个函数
您可以调用Task.ContinueWith
作为“处理程序”在任务完成时执行。事实上,TaskAwaiter
就是这样做的
老实说,你的问题并不十分清楚,但是如果你真的想创建一个任务
,然后你可以随时强制完成它,我想你只是想-调用或方法来指示适当的完成类型。(或者您可以调用TrySet…
versions。)使用该属性将任务返回到需要的任何位置
据我所知,它本质上是一个轻量级线程
不,那不是真的。在某些情况下,我可能是对的,但这只是任务
的一种用法。可以通过向线程传递委托并让它执行(通常是异步的,可能是同步的,默认情况下使用线程池)来启动线程
使用线程的另一种方法是使用TaskCompletionSource
。当您这样做时,任务(可能)不会创建任何线程,也不会使用线程池或任何类似的线程。此模型的一个常见用法是将基于事件的API转换为基于任务的API:
我们假设,仅仅因为这是一个常见的例子,我们希望有一个任务
,它将在关闭来自的时完成。已经有一个FormClosed
事件在该事件发生时触发:
public static Task WhenClosed(this Form form)
{
var tcs = new TaskCompletionSource<object>();
form.FormClosing += (_, args) =>
{
tcs.SetResult(null);
};
return tcs.Task;
}
这段代码现在的工作方式与它所读的一样;创建一个新表单,隐藏自己,显示弹出窗口,等待弹出窗口关闭,然后再次显示自己。但是,由于它不是阻塞等待,因此UI线程不会被阻塞。我们也不需要为事件操心;添加处理程序,处理多个上下文;改变我们的逻辑,或任何逻辑。(所有这些都发生了,我们只是不知道而已。)这可能会帮到你:@Woodrow Douglass对于每个任务,你都可以创建它的延续,这也是一个任务。
private async void button1_Click(object sender, EventArgs e)
{
Form2 popup = new Form2();
this.Hide();
popup.Show();
await popup.WhenClosed();
this.Show();
}