C# Task.Run(()MethodName())并等待Task.Run(async()=>;MethodName())

C# Task.Run(()MethodName())并等待Task.Run(async()=>;MethodName()),c#,parallel-processing,task,C#,Parallel Processing,Task,我正在试图了解是否使用 await Task.Run(async () => MethodName()) 在MVC5中,可以释放长时间运行的IO操作的线程,同时并行地继续执行其他代码任务 我知道简单地使用“await MethodName()”将释放线程,但它不会移动到下一行代码单元MethodName()执行完毕。(如果我错了,请纠正我) 我希望能够在异步操作执行时释放线程,并并行执行其他代码。我想使用它来并行地对不同的数据源进行多个调用。这就是“wait Task.Run(async

我正在试图了解是否使用

await Task.Run(async () => MethodName())
在MVC5中,可以释放长时间运行的IO操作的线程,同时并行地继续执行其他代码任务

我知道简单地使用“await MethodName()”将释放线程,但它不会移动到下一行代码单元MethodName()执行完毕。(如果我错了,请纠正我)

我希望能够在异步操作执行时释放线程,并并行执行其他代码。我想使用它来并行地对不同的数据源进行多个调用。这就是“wait Task.Run(async()=>MethodName())实现的功能吗?

不,不要这样做

相反,不要等待,直到你不得不这样做。因此,与其这样做

await MethodName();
DoSomeOtherWork();

这可以让后台IO工作和您的
DoSomeOtherWork()
同时进行,而无需占用线程

如果您有多个IO任务要执行,您可以将它们与一个
任务一起分组。whalll

Task<DbOneResults> dbOne= GetDbOneRecords();
Task<DbTwoResults> dbTwo = GetDbTwoRecords();
Task<DbThreeResults> dbThree = GetDbThreeRecords();

//This line is not necessary, but if you wanted all 3 done before you 
//started to process the results you would use this. 
await Task.WhenAll(dbOne, dbTwo, dbThree);

//Use the results from the 3 tasks, its ok to await a 2nd time, it does not hurt anything.
DbOneResults dbOneResults = await dbOne;
DbTwoResults dbTwoResults = await dbTwo;
DbThreeResults dbThreeResults = await dbThree;
Task dbOne=GetDbOneRecords();
Task dbTwo=getdbtworrecords();
Task dbThree=GetDbThreeRecords();
//这一行是不必要的,但如果你想在你之前完成所有3个
//已开始处理您将使用的结果。
等待任务。WhenAll(dbOne,dbTwo,dbThree);
//使用3项任务的结果,第二次等待是可以的,这不会造成任何伤害。
DbOneResults DbOneResults=等待dbOne;
dbtworresults dbtworresults=等待dbTwo;
DbThreeResults DbThreeResults=等待dbThree;
这可以让所有3个任务同时发生,而不会占用任何线程。

不,不要这样做

相反,不要等待,直到你不得不这样做。因此,与其这样做

await MethodName();
DoSomeOtherWork();

这可以让后台IO工作和您的
DoSomeOtherWork()
同时进行,而无需占用线程

如果您有多个IO任务要执行,您可以将它们与一个
任务一起分组。whalll

Task<DbOneResults> dbOne= GetDbOneRecords();
Task<DbTwoResults> dbTwo = GetDbTwoRecords();
Task<DbThreeResults> dbThree = GetDbThreeRecords();

//This line is not necessary, but if you wanted all 3 done before you 
//started to process the results you would use this. 
await Task.WhenAll(dbOne, dbTwo, dbThree);

//Use the results from the 3 tasks, its ok to await a 2nd time, it does not hurt anything.
DbOneResults dbOneResults = await dbOne;
DbTwoResults dbTwoResults = await dbTwo;
DbThreeResults dbThreeResults = await dbThree;
Task dbOne=GetDbOneRecords();
Task dbTwo=getdbtworrecords();
Task dbThree=GetDbThreeRecords();
//这一行是不必要的,但如果你想在你之前完成所有3个
//已开始处理您将使用的结果。
等待任务。WhenAll(dbOne,dbTwo,dbThree);
//使用3项任务的结果,第二次等待是可以的,这不会造成任何伤害。
DbOneResults DbOneResults=等待dbOne;
dbtworresults dbtworresults=等待dbTwo;
DbThreeResults DbThreeResults=等待dbThree;
这可以让所有3个任务同时发生,而不会占用任何线程。

不,不要这样做

相反,不要等待,直到你不得不这样做。因此,与其这样做

await MethodName();
DoSomeOtherWork();

这可以让后台IO工作和您的
DoSomeOtherWork()
同时进行,而无需占用线程

如果您有多个IO任务要执行,您可以将它们与一个
任务一起分组。whalll

Task<DbOneResults> dbOne= GetDbOneRecords();
Task<DbTwoResults> dbTwo = GetDbTwoRecords();
Task<DbThreeResults> dbThree = GetDbThreeRecords();

//This line is not necessary, but if you wanted all 3 done before you 
//started to process the results you would use this. 
await Task.WhenAll(dbOne, dbTwo, dbThree);

//Use the results from the 3 tasks, its ok to await a 2nd time, it does not hurt anything.
DbOneResults dbOneResults = await dbOne;
DbTwoResults dbTwoResults = await dbTwo;
DbThreeResults dbThreeResults = await dbThree;
Task dbOne=GetDbOneRecords();
Task dbTwo=getdbtworrecords();
Task dbThree=GetDbThreeRecords();
//这一行是不必要的,但如果你想在你之前完成所有3个
//已开始处理您将使用的结果。
等待任务。WhenAll(dbOne,dbTwo,dbThree);
//使用3项任务的结果,第二次等待是可以的,这不会造成任何伤害。
DbOneResults DbOneResults=等待dbOne;
dbtworresults dbtworresults=等待dbTwo;
DbThreeResults DbThreeResults=等待dbThree;
这可以让所有3个任务同时发生,而不会占用任何线程。

不,不要这样做

相反,不要等待,直到你不得不这样做。因此,与其这样做

await MethodName();
DoSomeOtherWork();

这可以让后台IO工作和您的
DoSomeOtherWork()
同时进行,而无需占用线程

如果您有多个IO任务要执行,您可以将它们与一个
任务一起分组。whalll

Task<DbOneResults> dbOne= GetDbOneRecords();
Task<DbTwoResults> dbTwo = GetDbTwoRecords();
Task<DbThreeResults> dbThree = GetDbThreeRecords();

//This line is not necessary, but if you wanted all 3 done before you 
//started to process the results you would use this. 
await Task.WhenAll(dbOne, dbTwo, dbThree);

//Use the results from the 3 tasks, its ok to await a 2nd time, it does not hurt anything.
DbOneResults dbOneResults = await dbOne;
DbTwoResults dbTwoResults = await dbTwo;
DbThreeResults dbThreeResults = await dbThree;
Task dbOne=GetDbOneRecords();
Task dbTwo=getdbtworrecords();
Task dbThree=GetDbThreeRecords();
//这一行是不必要的,但如果你想在你之前完成所有3个
//已开始处理您将使用的结果。
等待任务。WhenAll(dbOne,dbTwo,dbThree);
//使用3项任务的结果,第二次等待是可以的,这不会造成任何伤害。
DbOneResults DbOneResults=等待dbOne;
dbtworresults dbtworresults=等待dbTwo;
DbThreeResults DbThreeResults=等待dbThree;

这可以让所有3个任务同时发生,而不占用任何线程。

您可以将生成的任务存储在某个变量中,然后等待它。即:

var task = LongRunningMethodAsync();

SomeOtherWork();
SomeWorkOtherThanBefore();

awai task;
您还可以存储许多方法的结果任务并等待所有方法:

var tasks = new Task[] {
   FirstMethodAsync(),
   SecondMethodAsync(),
   ThirdMethodAsync()
};

await Task.WhenAll(tasks);

您可以将生成的任务存储在某个变量中,然后等待它。即:

var task = LongRunningMethodAsync();

SomeOtherWork();
SomeWorkOtherThanBefore();

awai task;
您还可以存储许多方法的结果任务并等待所有方法:

var tasks = new Task[] {
   FirstMethodAsync(),
   SecondMethodAsync(),
   ThirdMethodAsync()
};

await Task.WhenAll(tasks);

您可以将生成的任务存储在某个变量中,然后等待它。即:

var task = LongRunningMethodAsync();

SomeOtherWork();
SomeWorkOtherThanBefore();

awai task;
您还可以存储许多方法的结果任务并等待所有方法:

var tasks = new Task[] {
   FirstMethodAsync(),
   SecondMethodAsync(),
   ThirdMethodAsync()
};

await Task.WhenAll(tasks);

您可以将生成的任务存储在某个变量中,然后等待它。即:

var task = LongRunningMethodAsync();

SomeOtherWork();
SomeWorkOtherThanBefore();

awai task;
您还可以存储许多方法的结果任务并等待所有方法:

var tasks = new Task[] {
   FirstMethodAsync(),
   SecondMethodAsync(),
   ThirdMethodAsync()
};

await Task.WhenAll(tasks);

在执行下一行代码之前,它仍将等待任务完成。似乎您要做的是:
wait task。当所有(…tasks…
时,是否有一种替代方法可以兼顾这两种方法的优点?我真的很想并行执行这些调用,但不想长时间阻塞多个线程。您能否发布一个更好的代码示例,显示您希望异步运行的不同操作?async/await是C#5.0中引入的一个特性,因此它在MVC 5项目中可用,但它只是一个C#特性,因此您可以在任何C#代码中使用它,这些C#代码将由符合C#5.0+的编译器编译供参考。在执行下一行代码之前,它仍将等待任务完成。似乎您要做的是:
await任务。当所有(…任务…
时,是否有另一种方法可以使