2010-04-09 32 views
0

我需要在我的asp.net.net mvc项目类中为存储库方法实现时间计算。问题是我需要将时间计算数据发送到WCF服务,这非常耗时。我想到的线程可以帮助异步调用WCF服务。但是我对此很少有经验。我是否每次都需要创建新的线程,或者我可以创建一个全局线程,如果是的话,那么该怎么做?我有类似的东西:计算方法执行的时间并发送到WCF服务异步

秒表类

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(); 
    } 
} 

在库

public class SomeRepository 
{ 
    public List<ObjectInfo> List() 
    { 
     StopWatch sw = new StopWatch(); 
     sw.Start(); 
     //performing long time operation 
     sw.Stop(); 
    } 
} 

我在做什么毛病线程使用秒表类的?性能原因,我如何重用线程?

回答

1

你的代码似乎很好。一旦完成了长时间运行的操作,就会产生一个新线程并在此线程中执行对Web服务的调用。这对我来说似乎是一个好方法。另一种可能性是使用由Web服务代理生成的BeginXXXEndXXX方法(svcutil.exe/async选项)。

+0

我很担心每次创建新线程时的性能问题。也许最好使用全局线程对象进行这样的操作? – wassertim 2010-04-09 11:57:41

+0

没有全局线程对象这样的事情。既可以手动创建线程(如您所做的那样),也可以使用使用IO完成端口的BeginXXX,EndXXX方法,并且效率非常高,因为在执行调用期间不会消耗线程。在这种情况下,对Web服务的调用从main开始,并且此主线程立即返回到线程池。 – 2010-04-09 12:10:27

+0

是的,没有全局线程。但是我们可以以某种方式重用线程?每次创建新线程效率不高 – wassertim 2010-04-09 12:15:47

1

为什么不使用.NET ThreadPool和QueueUserWorkItem方法?你不必担心开始线程,你只需排队和完成。

你只需要调用类似

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"); 
            });