簡體   English   中英

如何使用Thread.Sleep與Task.Run而不阻止主踏板

[英]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將始終將工作排隊到線程池,而主(入口點)線程永遠不是線程池線程。

使用線程池。

    static void Main(string[] args)
    {
        ThreadPool.QueueUserWorkItem(o => { Thread.Sleep(5000); Console.WriteLine("Threadpool task done."); });
        for( int i = 0; i < 10; i++)
        {
            Console.WriteLine("Main thread: {0}", i);
            Thread.Sleep(1000);
        }

        Console.ReadLine();
    }

輸出應如下所示: 在此輸入圖像描述

您當前的代碼應該可以工作,但是您需要在任務上調用Start()方法來調用它。

您也可以通過線程實現此目的:

new System.Threading.Thread(() => {
    System.Threading.Thread.Sleep(500);
}).Start();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM