事件完成的任务

Task that completes on event

我正在尝试编写一个 returns 任务的 C# 方法。该任务应该注册到另一个对象(我没有写也没有控制)上的事件,并在事件被触发时完成。事件参数包含任务的结果。

我尝试了以下想法(这是不好的...):

public Task<int> GetValue(ObjectToWaitFor waitFor)
{
    var flag = false;
    int value = -1;

    return Task.Factory.StartNew<int>(() => 
    {
        waitFor.TheEvent += (s, e) =>
        {
            value = e.Value;
            flag = true;
        };
        while (!flag)
        {
            Task.Delay(100).Wait();
        }

        return value;
    });
}

使用在事件处理程序上设置为 true 的标志,然后让任务循环直到标志设置为 true。但这似乎不是一个优雅的解决方案,我想知道是否有更好的方法。

我怀疑您正在寻找 TaskCompletionSource<TResult>。基本上,您创建其中一个(并记住它),然后交回它在 Task 属性.

中提供的任务

当事件被触发时,在完成源上设置适当的result/fault,就大功告成了。

扩展@jonskeet 的回答:

void Main()
{
    var foo = new Foo();
    //type parameter here defines the type of the Task
    //so here, we're expecting to make a Task<int>
    var tcs = new TaskCompletionSource<int>();
    foo.Evt += (sender, eventArgs) => {
        tcs.SetResult(0);
        //or tcs.SetException(someException);
        //etc...
    };
    //here's your task, ready to go.
    Task<int> task = tcs.Task;
}
class Foo
{
    public event EventHandler Evt;
}