Task<int> task = new Task<int>(CountCharactersIntheFile);
task.Start();
int count=await task;
int count = await Task.Run(() => CountCharactersInTheFile());
,當我寫異步代碼爲每可讀性和速度應該怎麼用?
Task<int> task = new Task<int>(CountCharactersIntheFile);
task.Start();
int count=await task;
int count = await Task.Run(() => CountCharactersInTheFile());
,當我寫異步代碼爲每可讀性和速度應該怎麼用?
讓我們來檢查一下源代碼。 Task.Run
基本上調用Task.InternalStartNew
與一堆默認參數。這是how that method作品:
internal static Task InternalStartNew(
Task creatingTask, Delegate action, object state, CancellationToken cancellationToken, TaskScheduler scheduler,
TaskCreationOptions options, InternalTaskOptions internalOptions, ref StackCrawlMark stackMark)
{
// Validate arguments.
if (scheduler == null)
{
throw new ArgumentNullException("scheduler");
}
Contract.EndContractBlock();
// Create and schedule the task. This throws an InvalidOperationException if already shut down.
// Here we add the InternalTaskOptions.QueuedByRuntime to the internalOptions, so that TaskConstructorCore can skip the cancellation token registration
Task t = new Task(action, state, creatingTask, cancellationToken, options, internalOptions | InternalTaskOptions.QueuedByRuntime, scheduler);
t.PossiblyCaptureContext(ref stackMark);
t.ScheduleAndStart(false);
return t;
}
正如你所看到的,它創建的任務,並最終啓動它。然而,它確實有點像調度它,並確保上下文。因此,儘可能地使用Task.Run
可能是一個非常好的主意,可以避免必須手動完成所有這些操作。但基本上他們只是在不同的深度做「相同」的事情。
Task<int> task = new Task<int>(CountCharactersIntheFile);
task.Start();
int count=await task;
和
int count = await Task.Run(() => CountCharactersInTheFile());
相同。根據我的理解,沒有這樣的區別。只是一個縮小/ lambda格式的第一個
根據我的所知,沒有一個。 –