双工服务/ Singleton类与后台线程

时间:2010-11-04 12:50:53

标签: wcf c#-4.0

我想知道是否有人可以帮助我。我有一个运行TCP的wcf服务,它将使用双工服务。目前,该服务调用业务对象,而业务对象又进行一些处理。虽然此处理是在后台线程上进行的,但我希望在某些点更新UI。我在下面附上了我的代码。 TestStatus应分为六个部分,每次更改时,服务都应更新Windows窗体UI。

Scenariocomponent类是一个单例(以下)。

    public void BeginProcessingPendingTestCases()
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessPendingTestCases));
    }
    public void BeginProcessingPendingTestCases()
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessPendingTestCases));
    }

    private void ProcessPendingTestCases(object state)
    {
        while (this.IsProcessingScenarios)
        {
            ProcessNextPendingTestCase();
        }
    }

    private void ProcessNextPendingTestCase()
    {
        while (this.ServiceStatus == Components.ServiceStatus.Paused)
        {
            //Wait.
        }

        var testOperation = this.PendingTestCases.Dequeue();

        if (testOperation.OperationStatus == TestStatus.Pending)
        {
            throw new NotImplementedException(); //TODO : Handle test.

            if (testOperation.OperationStatus != TestStatus.Failed)
            {
                testOperation.OperationStatus = TestStatus.Processed;
            }

            this.CompletedTestCases.Enqueue(testOperation);
        }
    }

最初我使用MSMQ来更新UI,因为它工作得很充分,但由于客户端限制,这已不再可接受。

我的服务如下:

public class TestHarnessService : ITestHarnessService
{
    public bool Ping()
    {
        return true;
    }

    public bool IsProcessingScenarios()
    {
        return ScenarioComponent.Instance.IsProcessingScenarios;
    }

    public void BeginProcessingScenarios(string xmlDocument, Uri webServiceUri)
    {
        var doc = new XmlDocument();
        doc.LoadXml(xmlDocument);

        var scenarios = ScenarioComponent.Deserialize(doc);
        ScenarioComponent.Instance.EnqueueScenarioCollection(scenarios, webServiceUri);
        ScenarioComponent.Instance.BeginProcessingPendingTestCases();
    }

    public void ValidateScenarioDocument(string xmlDocument)
    {
        var doc = new XmlDocument();
        doc.LoadXml(xmlDocument);

        ScenarioComponent.ValidateScenarioSchema(doc);
    }

    ITestOperationCallBack Callback
    {
        get
        {
            return OperationContext.Current.GetCallbackChannel<ITestOperationCallBack>();
        }
    }

现在我需要在每次测试操作更改或完成时更新UI,但我不确定如何完成此操作。任何反馈将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用WPF和绑定代替使用WinForms,它可以为您处理更新。