C# 是否有方法发出System.Threading.Tasks.Task已完成的信号?

C# 是否有方法发出System.Threading.Tasks.Task已完成的信号?,c#,.net,C#,.net,我有一个图书馆,它是许多网络连接的复杂仲裁者。它的主要对象的每个方法都接受一个委托,当网络响应给定的请求时调用该委托 我想将我的库转换为使用新的.NET4.5“async/await”模式;这将需要我返回一个“Task”对象,它将向用户发出调用的异步部分已完成的信号。创建这个对象需要任务表示一个函数——据我所知,它本质上是一个轻量级线程 这并不符合我的库的设计——我希望任务的行为更像一个事件,并直接向用户发出他们的请求已完成的信号,而不是表示一个函数。这可能吗?我是否应该避免以这种方式滥用“异步

我有一个图书馆,它是许多网络连接的复杂仲裁者。它的主要对象的每个方法都接受一个委托,当网络响应给定的请求时调用该委托

我想将我的库转换为使用新的.NET4.5“async/await”模式;这将需要我返回一个“Task”对象,它将向用户发出调用的异步部分已完成的信号。创建这个对象需要任务表示一个函数——据我所知,它本质上是一个轻量级线程

这并不符合我的库的设计——我希望任务的行为更像一个事件,并直接向用户发出他们的请求已完成的信号,而不是表示一个函数。这可能吗?我是否应该避免以这种方式滥用“异步/等待”模式

我不知道我的措辞是否恰当,我希望你理解我的意思。谢谢你的帮助

我想将我的库转换为使用新的.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();
}