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