计算方法执行的时间并发送到WCF服务异步

时间:2010-04-09 11:42:07

标签: asp.net-mvc multithreading

我需要在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();
    }
}

线程有什么问题?出于性能原因我如何重用线程?

2 个答案:

答案 0 :(得分:1)

您的代码似乎很好。完成长时间运行操作后,您将生成一个新线程并在此线程中执行对Web服务的调用。这对我来说似乎是一个很好的方法。另一种可能性是使用由Web服务代理(svcutil.exeBeginXXX选项)生成的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");
                                    });