1

TPL 有什么好的方法可以创建一个本身不做任何事情的任务,但它的存在只是为了等待,直到系统中的某个其他事件用数据触发它以使任务返回?

如果触发事件本身是 aTask或遵循FromAsyncIAsyncResult期望的模式,则内置支持。但是事件的不同形式是什么?

不满意的解决方案:

我最接近的方法是创建一个任务,该任务在执行时返回一个可变对象包含的值。这是一个使用 1 元素数组作为可变对象的示例:

var task = new Task<ReturnType>(
    resultContainer => ((ReturnType[])resultContainer)[0],
    new ReturnType[1]);

在代码的其他地方,当事件发生时,结果容器的内容被设置并启动任务:

((ReturnType[])task.AsyncState)[0] = theResult;
task.Start();

这允许其他一些代码等待任务:

ResultType result = await task;

左鼻孔代码气味:当任务中没有完成任何实际工作时,必须启动任务并执行其入口点方法。

右鼻孔代码气味:唯一目的是包含任务返回值的持有者对象。

有谁在乎净化空气吗?

4

1 回答 1

0

使用TaskCompletionSource<T>. 像这样创建源:

var source = new TaskCompletionSource<ReturnType>();
Task task = source.Task; // Hand this off to the awaiting code.

当事件发生时,设置结果如下:

source.SetResult(theResult);
于 2013-06-23T04:36:15.797 回答