我有一些代码可以创建一个任务,该任务可以像这样进行一些缓慢的工作:

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/

10-16 18:35