相关疑难解决方法(0)

将ManualResetEvent包装为等待任务

我想等待手动重置事件,超时并观察取消.我想出了类似下面的东西.手动重置事件对象由我无法控制的API提供.有没有办法在不接受和阻止ThreadPool线程的情况下实现这一点?

static Task<bool> TaskFromWaitHandle(WaitHandle mre, int timeout, CancellationToken ct)
{
    return Task.Run(() =>
    {
        bool s = WaitHandle.WaitAny(new WaitHandle[] { mre, ct.WaitHandle }, timeout) == 0;
        ct.ThrowIfCancellationRequested();
        return s;
    }, ct);
}

// ...

if (await TaskFromWaitHandle(manualResetEvent, 1000, cts.Token))
{
    // true if event was set
}
else 
{
    // false if timed out, exception if cancelled 
}
Run Code Online (Sandbox Code Playgroud)

将帖子显然,这是有道理的使用RegisterWaitForSingleObject.我试试看.

.net c# multithreading task-parallel-library async-await

29
推荐指数
3
解决办法
2万
查看次数

如何使用任务有条不紊地运行代码

我有一个负责检索资源的课程,这些课程也会对它们进行快速访问.该类公开了一种用于检索资源的异步方法:

public Task<object> GetResourceAsync(string resourceName)
{
    return Task.Factory.StartNew<object>(() =>
    {
        // look in cache

        // if not found, get from disk

        // return resource
    });
}
Run Code Online (Sandbox Code Playgroud)

然后客户端代码如下所示:

myResourceProvider.GetResourceAsync("myResource")
    .ContinueWith<object>(t => Console.WriteLine("Got resource " + t.Result.ToString()));
Run Code Online (Sandbox Code Playgroud)

这样,始终使用后台线程.但是,如果在缓存中找到对象,我不希望代码异步运行.如果在缓存中找到它,我想立即返回资源而不必使用另一个线程.

谢谢.

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

13
推荐指数
1
解决办法
4687
查看次数

.NET 4.0的Task类 - Promise接口?

这个Task类有一个promise接口,比如jQuery的deferred promise方法吗?

.net task-parallel-library

12
推荐指数
3
解决办法
3169
查看次数

无尽的异步和等待?

我不明白async/await的一些东西:

async方法必须在内部进行await调用...但是如果有等待它是因为它正在调用另一个异步方法,对吧?所以它似乎是一个无休止的异步方法链,等待内部调用另一个异步方法.

因此可以创建一个"第一"异步方法,而不是调用任何其他异步方法.只需创建一个异步方法,因为该方法可以完成许多可能会降低系统速度的工作.

.net c# asynchronous async-await

7
推荐指数
1
解决办法
1202
查看次数