我选择返回 Task<T>
和 Task
从我的对象方法中提供 gui 的简单使用。一些方法只是等待其他类型的 waithandles 的互斥锁。有没有办法构造Task
来自 WaitHandle.Wait()
这样我就不必为此阻塞一个线程。
最佳答案
有一种方法可以做到这一点:您可以使用 ThreadPool.RegisterWaitForSingleObject 订阅 WaitHandle方法并通过 TaskCompletionSource 包装它类(class):
public static class WaitHandleEx
{
public static Task ToTask(this WaitHandle waitHandle)
{
var tcs = new TaskCompletionSource<object>();
// Registering callback to wait till WaitHandle changes its state
ThreadPool.RegisterWaitForSingleObject(
waitObject: waitHandle,
callBack:(o, timeout) => { tcs.SetResult(null); },
state: null,
timeout: TimeSpan.MaxValue,
executeOnlyOnce: true);
return tcs.Task;
}
}
用法:
WaitHandle wh = new AutoResetEvent(true);
var task = wh.ToTask();
task.Wait();
关于multithreading - 从 WaitHandle.Wait 构造任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13741694/