我會避免直接使用線程並使用Microsoft的Reactive Extensions(NuGet「Rx-Main」)來抽象出線程的管理。
我不知道xmldiff.Compare(item, secondary, output)
確切的簽名,但如果我認爲它會產生一個整數,然後我可以用的Rx做到這一點:
var query =
from item in list.ToObservable()
from result in
Observable
.Start(() => xmldiff.Compare(item, secondary, output))
.Timeout(TimeSpan.FromSeconds(5.0), Observable.Return(-1))
select new { item, result };
var subscription =
query
.Subscribe(x =>
{
/* do something with `x.item` and/or `x.result` */
});
這通過每個item
自動迭代,然後開始xmldiff.Compare
背景計算,但只允許每個計算在返回默認值-1
之前花費多達5.0
秒。
subscription
變量是IDisposable
,所以如果您想在完成之前中止整個query
,請撥打.Dispose()
。
請顯示[mcve]。 – Enigmativity
它確實取決於Compare()'方法本身的內部代碼。沒有我們可以插入的神奇代碼,只會暫停/中止任何類似的事情 –
如果您使用的是.net 4.0及以上版本,我建議您查看TPL /異步...等待。對於不應該阻止/掛起UI的長時間運行的進程。您需要將進程推送到後臺線程,最好在線程池中。 – CarbineCoder