簡體   English   中英

在具有超時的同一線程(無線程池)中同步運行任務

[英]Synchronously run a task in the same thread (no threadpool) with a timeout

我想使用Task <>類型,但不是使用TPL,而是使用.NET4.5 / C#async。

事實是,我對我的案子有一些要求:

  • 我希望任務同步運行(有些人推薦RunSynchronously() ,其他人Wait() ,還有其他的ContinueWith(_, TaskContinuationOptions.ExecuteSynchronously) ,哪一個就足夠了?)。
  • 我希望任務在同一個線程中運行(所以,根本不使用線程池)。
  • 我希望任務在超過某個超時后停止,並拋出異常。

對於后者,我認為我需要Task.Delay()但我不確定如何將它與前兩個要求結合起來。 謝謝

這個答案是基於@ svick的評論。

我將假設您希望方法的所有“工作”都在與調用者相同的線程上完成,但是您不介意線程池線程是否用於取消目的(I'假設這是因為你提到了Task.Delay ,它將使用一個Timer ,當計時器觸發時它將使用一個線程池線程。

也就是說,不需要Task ,因為當方法返回時,您肯定知道任務已完成。 只是一個超時的常規方法會:

static void DoSomethingOrThrowAfterTimeout(int millisecondsTimeout)
{
    CancellationTokenSource cts = new CancellationTokenSource(millisecondsTimeout);
    CancellationToken ct = cts.Token;
    // do some work
    ct.ThrowIfCancellationRequested();
    // do more work
    ct.ThrowIfCancellationRequested();
    // repeat until done.
}

顯然,使用這種使用協作取消的方法,該方法不會在超時時准確超時,因為它取決於您在方法中拆分工作的程度。

如果你想避免使用另一個線程(對於CancellationTokenSource ),那么你可以跟蹤開始時間,然后在方法的不同點檢查已經過了多少時間(看你是否超過了超時)(比如如何在上面使用ct.ThrowIfCancellationRequested()

暫無
暫無

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

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