public EnumerableObservable(IEnumerable<T> enumerable)
{
this.enumerable = enumerable;
this.cancellationSource = new CancellationTokenSource();
this.cancellationToken = cancellationSource.Token;
this.workerTask = Task.Factory.StartNew(() =>
{
try
{
foreach (var value in this.enumerable)
{
//if task cancellation triggers, raise the proper exception
//to stop task execution
cancellationToken.ThrowIfCancellationRequested();
foreach (var observer in observerList)
{
observer.OnNext(value);
}
}
}
catch (AggregateException e)
{
Console.Write(e.ToString());
}
}, this.cancellationToken);
}
回答
AggregateExceptions當在異步操作的例外可能發生大量拋出。它們包含所有例外情況,例如鏈接Tasks(通過。ContinueWith)或級聯async/await調用。
正如@Mitch Stewart指出的那樣,在你的例子中,正確的例外類型是OperationCancelledException。
實際上,如果引發異常的標記與傳遞給該標記的標記是相同的,那麼如果使用該異常,它將使'workerTask.IsCanceled == true' 'Task.Run'或'Task.Factory.StartNew' –
當然,但是隨着優雅的取消,人們可以更好地控制異步執行的實際終止。 爲什麼TPL開發團隊首先實施Cancellatio基礎架構有很多很好的理由,因爲前者的線程模型並沒有提供默認的機制。 另請參閱本文後從2004年回覆[爲什麼Thread.Abort是邪惡的](http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation) –
我不明白你的評論。使用'ThrowIfCancellationRequested' [被認爲是優雅的取消](https://msdn.microsoft.com/en-us/library/dd997364(v = vs.110).aspx)。不知道你爲什麼提出了Thread.Abort。 –
由於ThrowIfCancellationRequested()拋出型OperationCanceledException的一個異常時,必須趕上OperationCanceledException或它的基類中的一個。
https://msdn.microsoft.com/en-us/library/system.operationcanceledexception(v=vs.110).aspx
- 1. 在處理代碼點時,Ruby會如何處理text.inject(「」,:<<)?
- 2. 的Rails搞亂我的代碼以「<<<<<<< HEAD」
- 3. 捕捉<select>
- 4. <%$,<%@,<%=,<%#...這是怎麼回事?
- 5. 活動並從這個代碼這段代碼</p> <pre><code> startActivityForResult(new Intent(PictureEditor.this, CustomCamera.class), CAMERA_REQUEST3); </code></pre> <p>拍照的Android
- 6. C代碼格式<<
- 7. git「<<<<<<< HEAD」
- 8. 「<<<<<<< HEAD」模板
- 9. PHP <<<(?多行處理程序)的問題
- 10. 請解釋一下這個PHP代碼 「<<< CSS」
- 11. 捕捉的ImageIO:<ERROR>
- 12. Heredoc <<<或<<?
- 13. erlang,ejabberd,如何處理[{text,<<>>,<<"hello">>}]格式
- 14. <xsl:if >如何處理「<Test/>」這樣的標籤?
- 15. operator <<:std :: cout << i <<(i << 1);
- 16. 'std :: operator <<'operator <<'不匹配'std :: operator <<
- 17. 如何捕捉從<div id="whatever"><a class="action-add" href="/x/y/z">add</a></div>
- 18. 爲什麼不使用<< EOF代替cat << EOF?
- 19. &lt;'代替'<' - WSO2代理服務
- 20. 這是什麼算子<<< bash
- 21. << <<超載
- 22. github增加<<<<<<< HEAD
- 23. 什麼手段<<<在PHP
- 24. PHP塊開始<?PHP =代替<?PHP
- 25. 有當執行<code>task</code>方法通用的AsyncTask處理
- 26. 什麼是代碼中的「<< - 」?
- 27. 如何處理的ICollection <>字段
- 28. 模塊類<< self constants
- 29. 什麼是我的檔案中的「<<<<<<< head」?
- 30. 批處理腳本如何執行「cat << eof」的等效操作?
Catch'OperationCanceledException' – JSteward