Await async TaskEx

14

什么是TaskEx?在http://www.i-programmer.info/programming/c/1514-async-await-and-the-ui-problem.html?start=1await TaskEx.DelayAwait async clarification中使用。我用它来

Task DoWork()
{
    return Task.Run(() =>
    {
        for (int i = 0; i < 30; i++)
        {
            Thread.Sleep(1000 * 60 * 30);
        }
    });
}

这里有一些例子

Task DoWork()
{
   return TaskEx.Run(() =>
   {
     for (int i = 0; i < 10; i++)
     {
         Thread.Sleep(500);
     }
   }
 });

我称之为await DoWork();。 如果只使用Taskawait不返回任何内容,没有响应。如果使用TaskEx,则会显示上下文中不存在。 TaskEx应该是一个类或者具有某种函数的东西吗? 第一个方法有效,这是我的错误。

3个回答

29

TaskEx最初随着C# 5的异步/等待扩展的CTP一起发布,只是一个额外的类...在.NET 4.5发布之前,并且现在已经成为Async Targeting Pack(也称为Microsoft.Bcl.Async NuGet package),以便您想要使用async/await但是目标是.NET 4.0(没有它所需的一些代码)。

如果您正在使用.NET 4.5或更高版本,请直接使用Task.Run,它执行相同的功能。(您将不会使用定位包,因此不需要TaskEx。)异步定位包无法向现有的Task类添加静态方法,因此需要TaskEx存在。


但是我的 await DoWork(); 没有返回任何东西。 - Vladimir Laktionov
@VladimirLaktionov:我不知道你指的是什么。 - Jon Skeet
当我调用await DoWork()时,应该有一个暂停,然后进入Task DoWork()吗?{ return Task.Run(() => { for (int i = 0; i < 30; i++) { Thread.Sleep(1000 * 60 * 30); } }); }|| 对于暂停,暂停应该在Task DoWork()执行还是当它返回到Await DoWork;? - Vladimir Laktionov
4
如果您的问题主要是关于TaskEx,那么从您的问题中并不清楚 - 标题中有TaskEx。听起来您有两个不同的问题:1)什么是TaskEx,为什么我的编译器找不到它?2)为什么Task.Run的行为与我期望的不同。这些应该分别发布成不同的帖子。 - Jon Skeet
抱歉,这是一种奇怪的暂停方式,我将其放在循环内部,但它不会再次循环。也就是说,它确实会等待。这是我的错误。 - Vladimir Laktionov

0

它不仅存在于CTP中,也存在于异步目标包中。 - Jon Skeet
我只是按照MSDN上所述和接受的内容去做。我没有听说过异步目标包,它是.NET库的一部分吗? - sara
请按照我的回答中的链接进行操作 :) - Jon Skeet

0
这也可以通过使用 System.Threading.Timer 来实现。就如在 API文档中所述:

如果期间(period)为零(0)或 Timeout.Infinite 且到期时间(dueTime)不为 Timeout.Infinite,则会调用回调函数(callback)一次[...]

因此,可以像下面这样创建一个单次定时器:
Timer oneShotTimer = new Timer((object stateInfo) => {
  // your callback code here
}, null, yourOneShotTimePeriodHere, Timeout.Infinite);

在API中还有一个技巧,可以在回调方法内部处理定时器的释放:https://dev59.com/K2435IYBdhLWcg3wvy-_#26410217


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接