我想知道什么是最好的方式,以串行处理一个长期运行的进程的结果的低优先级的线程,但在使用.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