multithreading - 从 WaitHandle.Wait 构造任务

标签 multithreading c#-4.0 .net-4.0 task-parallel-library task

我选择返回 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/

相关文章:

multithreading - 多线程对 IO-bound 操作有意义吗?

multithreading - 在ZeroMQ中从多个线程到zmq_poll()一个REP套接字+ send()安全吗?

c# - WCF - 自定义绑定(bind)的配置

c# - 在数据表中查找重复项然后比较重复项

ios - requiresMainQueueSetup 和 dispatch_get_main_queue 的区别?

c# - 如何等待任务完成 Task.WhenAll ?

XML 导航和读取使用 C# 4.0 动态?

SQLite 抛出“SQL 中时间数据类型的 System.NotSupportedException

c# - 没有 DTC 的 TransactionScope 替代方案

c# - 未能发布 : could not find required file 'setup.bin'