[英]How to use Thread.Sleep with Task.Run without blocking main tread
是否可以確保任務在主線程之外的另一個線程上運行? 所以這段代碼不會打擾調用線程?
var task = Task.Run(() =>
{
//third party code i don't have access to
Thread.Sleep(3000);
});
我知道有Task.Delay
但我想確保該任務將在另一個線程上運行。
我認為有不同的方法可以實現你的目標。 但是根據你想要做的事情,我認為你可以使用async / await,這不會阻止你的用戶界面,並且可以讓你以異步方式控制你的任務。
正如MSDN所說:
異步方法旨在實現非阻塞操作。 在等待任務運行時,異步方法中的await表達式不會阻止當前線程。 相反,表達式將方法的其余部分作為延續進行注冊,並將控制權返回給異步方法的調用者。 async和await關鍵字不會導致創建其他線程。 異步方法不需要多線程,因為異步方法不能在自己的線程上運行。 該方法在當前同步上下文上運行,並僅在方法處於活動狀態時在線程上使用時間。 您可以使用Task.Run將CPU綁定的工作移動到后台線程,但后台線程無助於只等待結果可用的進程。
https://msdn.microsoft.com/en-us/library/mt674882.aspx
這是一個用法示例:
public async Task MyMethodAsync()
{
Task<int> runTask = RunOperationAsync();
int result = await longRunningTask;
Console.WriteLine(result);
}
public async Task<int> RunOperationAsync()
{
await Task.Delay(1000); //1 seconds delay
return 1;
}
這不會阻止您的UI
@Nico是正確的,理想情況下,你可以一直使用異步編程。 這種方法是理想的,因為它不會浪費線程休眠(或者,更實際的例子,阻止I / O)。
是否可以確保任務在主線程之外的另一個線程上運行?
是。 Task.Run
將始終將工作排隊到線程池,而主(入口點)線程永遠不是線程池線程。
您當前的代碼應該可以工作,但是您需要在任務上調用Start()
方法來調用它。
您也可以通過線程實現此目的:
new System.Threading.Thread(() => {
System.Threading.Thread.Sleep(500);
}).Start();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.