我想知道什麼是最好的方式,以串行處理一個長期運行的進程的結果的低優先級的線程,但在使用.NET 4.0 Parallel Extensions低優先級的線程順序排隊的項目。如何處理使用並行擴展
我有以下類,無論是否執行並提供結果:
public class Step
{
public string Name { get; set; }
public TimeSpan Duration { get; set; }
public bool Completed { get; set; }
public void Execute()
{
DateTime before = DateTime.Now;
RemotedService.DoSomeStuff();
Duration = DateTime.Now - before;
Completed = true;
}
}
我怎麼可以處理這些步驟,並將它們保存到一個文件,以便他們進行處理後?我想將它們保存到文件中,而RemotedService.DoSomeStuff()
正在等待服務器的響應。
寫入文件會是這樣:
想到的是將它們添加到一個Queue
並有
Timer
是處理它們
using (StreamWriter w = File.AppendText("myFile.txt"))
{
var completedStep = completedSteps.Dequeue();
w.WriteLine(string.Format("Completed {0} with result: {1} and duration {2}",
completedStep.Name,
completedStep.Completed,
completedStep.Duration));
}
一個選項。但是這並沒有利用遠程通話的停機時間。
想到的另一個選擇是使用System.Threading.Tasks.Task
/Step
將每個結果異步寫入文件,但這並不能保證它們將按順序保存,並且還可能引入與文件寫入的爭用。
原諒我的無知與線程,但我擔心的是,後臺線程會不必要地處理while循環,當隊列爲空,從而減慢了積極THEAD它實際上做的工作時間。這不是這種情況嗎? – 2010-11-23 11:03:28
換句話說,在後臺線程,LogQueue.IsCompleted()將被並反覆叫過來。我在一個while循環的中間看到了一個Thread.Sleep()來避免這種情況,但我知道這很糟糕。 – 2010-11-23 11:05:37