初始化任务并稍后启动

时间:2018-11-19 14:37:08

标签: c# constructor task

我需要先创建一个新任务,然后再做一些剩余的工作,然后再启动与其结果相符的任务。

简化示例:

static int value;
static async Task work1()
{
    do
    {
        int i;
        for (i = 0; i < 10000000; i++) {} // some calculations
        Console.WriteLine("result1: " + value + " i: " + i);
        await Task.Delay(2000).ConfigureAwait(false);
    } while (condition);
}

static async Task work2()
{
    do
    {
        int i;
        for (i = 0; i < 10000000; i++) {} // some calculations
        Console.WriteLine("result2: " + value + " i: " + i);
        await Task.Delay(2000).ConfigureAwait(false);
    } while (condition);
}

static void Main(string[] args)
{
    Task task;
    int tempvalue = 100;
    if (condition1)
    {
        tempvalue *= 10;
        task = new Task(() => work1());
    } else
    {
        tempvalue -= 5;
        task = new Task(() => work2()); 
    }
    if (tempvalue > 100)
    {
        value = 5;
    } else
    {
        value = tempvalue;
    }
    task.Start();
    // immediately do remaining work
}

此代码完全符合我的要求,但是编译器显示以下警告:

Warning CS4014  Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.

在线:

Task task = new Task(() => work());

我应该这样使用吗?有什么区别吗?

Task task = new Task(async () => await work());

这不是How to delay 'hot' tasks so they can processed in a set order的副本,因为在task.Start();之后,它应该立即进行剩余的工作。

Func<Task> f = () => work();
// do stuff
f(); // blocks thread until work1() or work2() hits await
// do remaining work

1 个答案:

答案 0 :(得分:-1)

async关键字表示任务中的任务是异步的,使用await意味着您要等待方法工作完成。

您还可以使用Task.Wait()来等待方法完成执行。 但是使用异步等待是更好的方法,因为它不会阻塞主线程。