我正在編寫一個使用.NET中的提供者模型模式的小型應用程序。每個提供者都有一個方法可以實現,以便在我的應用程序中插入。C#異步,完成一個任務時無需訪問代碼即可停止所有任務
我想在不同的線程中運行所有提供者的具體工作(實現的方法),但是當一個任務完成時,所有其他任務需要停止執行。
我使用.NET中的異步/等待模型和CancellationToken來取消任務。
tasks.Add(Task.Run(() =>
{
if (token.IsCancellationRequested)
token.ThrowIfCancellationRequested();
return provider.DoWork();
}, token));
while (tasks.Count > 0)
{
var t = await Task.WhenAny(tasks);
tasks.Remove(t);
var result = await t;
if (!string.IsNullOrEmpty(result))
{
tokenSource.Cancel();
return result;
}
}
一些provider.DoWork()方法可能會非常緩慢,並停止在DoWork的方法執行我要的DoWork方法內檢查token.IsCancellationRequested線程,但我不能因爲這些方法都寫例如,來自其他人。 DoWork之外的token.IsCancellationRequested檢查在這種情況下並不重要。總之,當一個任務完成時,其他任務必須停止,但不能訪問每個線程中運行的代碼。
期待聽到你的想法。
「最快速的供應商獲勝」是一個奇怪的模型,我不得不說 –
如果你不能相信供應商合作,並定期檢查取消令牌,那麼我懷疑你將不得不寫代碼管理提供程序的線程,並中止/中斷您希望停止的那些提供程序的線程。 –
@MarcGravell想象一下,提供者是一些用於搜索某些內容的html解析器,當其中一個人發現它並且其他人正在等待來自站點的響應5-10秒時,爲什麼我應該等待10秒。實際上,作爲代碼,我(作爲客戶端)將看到搜索結果,但任務不會被終止,並且CPU 100%是不必要的。 –