我需要在asp .net mvc项目类中实现存储库方法的时间计算。问题是我需要将时间计算数据发送到WCF服务,这是耗时的。我认为可以帮助异步调用WCF服务的线程。但我对它的经验很少。我是否每次都需要创建新线程,或者我可以创建一个全局线程,如果是,那么如何?我有类似的东西:
StopWatch类
public class StopWatch
{
private DateTime _startTime;
private DateTime _endTime;
public void Start()
{
_startTime = DateTime.Now;
}
protected void StopTimerAndWriteStatistics()
{
_endTime = DateTime.Now;
TimeSpan timeResult = _endTime - _startTime;
//WCF proxy object
var reporting = AppServerUtility.GetProxy<IReporting>();
//Send data to server
reporting.WriteStatistics(_startTime, _endTime, timeResult, "some information");
}
public void Stop()
{
//Here is the thread I have question with
var thread = new Thread(StopTimerAndWriteStatistics);
thread.Start();
}
}
在存储库中使用StopWatch类
public class SomeRepository
{
public List<ObjectInfo> List()
{
StopWatch sw = new StopWatch();
sw.Start();
//performing long time operation
sw.Stop();
}
}
线程有什么问题?出于性能原因我如何重用线程?
答案 0 :(得分:1)
您的代码似乎很好。完成长时间运行操作后,您将生成一个新线程并在此线程中执行对Web服务的调用。这对我来说似乎是一个很好的方法。另一种可能性是使用由Web服务代理(svcutil.exe
的BeginXXX
选项)生成的EndXXX
和/async
方法。
答案 1 :(得分:1)
为什么不使用带有QueueUserWorkItem方法的.NET ThreadPool?您不必担心启动该线程,只需将其排队并完成即可。
你只需要打电话给
ThreadPool.QueueUserWorkItem(new WaitCallback(StopTimerAndWriteStatistics));
或者您甚至可以使用lambda表达式并删除StopTimerAndWriteStatistics
方法。 (没有测试过这个)
ThreadPool.QueueUserWorkItem(() => {
_endTime = DateTime.Now;
TimeSpan timeResult = _endTime - _startTime;
//WCF proxy object
var reporting = AppServerUtility.GetProxy<IReporting>();
//Send data to server
reporting.WriteStatistics(_startTime, _endTime, timeResult, "some information");
});