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;
左鼻孔代码气味:当任务中没有完成任何实际工作时,必须启动任务并执行其入口点方法。
右鼻孔代码气味:唯一目的是包含任务返回值的持有者对象。
有谁在乎净化空气吗?