我有一些代码可以创建一个任务,该任务可以像这样进行一些缓慢的工作:
public static Task wait1()
{
return new Task(() =>
{
Console.WriteLine("Waiting...");
Thread.Sleep(10000);
Console.WriteLine("Done!");
});
}
在实际的实现中,Thread.Sleep实际上将是一个Web服务调用。我想更改可以使用await的方法的主体(这样它就不会在网络访问/ sleep 期间消耗线程)。我的第一次尝试(基于shot弹枪调试编译错误)是:
public static Task wait2()
{
return new Task(async () =>
{
Console.WriteLine("Waiting...");
await Task.Delay(10000);
Console.WriteLine("Done!");
});
}
然而;该任务的行为似乎与第一个任务不同,因为当我在其上调用.Wait()时;它立即返回。
以下是显示差异的完整示例(控制台应用程序)(该应用程序将在第二个任务开始时立即结束)。
我需要怎么做才能在某个任务中恰好有代码使用“等待”的情况下调用“开始”和“等待”?任务由代理排队并在以后执行,因此至关重要的是,不要自动启动任务。
class Program
{
static void Main(string[] args)
{
var w1 = wait1();
w1.Start();
w1.Wait(); // This waits 110 seconds
var w2 = wait2();
w2.Start();
w2.Wait(); // This returns immediately
}
public static Task wait1()
{
return new Task(() =>
{
Console.WriteLine("Waiting...");
Thread.Sleep(10000);
Console.WriteLine("Done!");
});
}
public static Task wait2()
{
return new Task(async () =>
{
Console.WriteLine("Waiting...");
await Task.Delay(10000);
Console.WriteLine("Done!");
});
}
}
最佳答案
看来这是不可能的!参见alexm's answer here:
:-(
我通过使代理程序代替队列Func<Task>s
来解决此问题,并且接收任务的重载只是将() => task
排队。然后;出队任务时,我检查它是否未运行,如果有,请启动它:
var currentTask = currentTaskFunction();
if (currentTask.Status == TaskStatus.Created)
currentTask.Start();
似乎必须这样做(如果此简单的解决方法有效;为什么对异步方法的原始限制总是总是很热?),但这似乎对我有用:-)
关于c# - 如何创建在主体内使用await的Task,该主体的行为与调用Wait时的同步版本相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17514442/