Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 初始化任务并稍后启动_C#_Constructor_Task - Fatal编程技术网

C# 初始化任务并稍后启动

C# 初始化任务并稍后启动,c#,constructor,task,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);

我需要先创建一个新任务,然后做一些剩余的工作,然后开始处理结果的任务

简化示例:

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
}
在线:

Task task = new Task(() => work());
我应该这样使用它吗?有什么区别吗

Task task = new Task(async () => await work());
这不是的副本,因为在
task.Start()之后它应该立即完成剩余的工作

Func<Task> f = () => work();
// do stuff
f(); // blocks thread until work1() or work2() hits await
// do remaining work
Func f=()=>work();
//做事
f();//阻止线程,直到work1()或work2()命中等待
//做剩余的工作

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

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

async
关键字意味着您可以使用
await
关键字,仅此而已。在我的实际代码中,在
task.Start()之后还有一些工作要做。因此Wait()不是一个选项。我的问题是为什么编译器会对
新任务(()=>work())显示警告
@LukAss741,因为您没有等待
工作
work
是一个异步任务,您不需要等待。@默认情况下,我不会在
新任务(()=>work())中故意等待它下班后没有其他工作()。主线程只应异步启动work(),并继续执行其余代码。它按预期工作。我只是不明白为什么它会显示警告。@LukAss741好吧,编译器不知道您不想故意等待它。但它确实知道,您不会等待一个
异步任务
。如果要避免警告,可以编写
Task t=work()
并忽略使用t。如果不打算启动任务,为什么需要创建任务?为什么不直接调用
任务。需要时运行
?我更新了代码,这样你就可以知道为什么我需要在其他工作完成后启动它
Task.Run
显然可以工作,但在这种情况下,需要将
if(tempvalue>100){..}else{..}
代码同时放在if和else中
if(condition1)
我无法为我自己的问题添加答案,因为它被错误地标记为重复。要摆脱“警告CS4014,因为此调用未被等待…”错误,应使用以下语法:
Task Task=new Task(()=>)更多关于
Func<Task> f = () => work();
// do stuff
f(); // blocks thread until work1() or work2() hits await
// do remaining work