C# 需要WPF线程帮助

C# 需要WPF线程帮助,c#,.net,wpf,C#,.net,Wpf,希望你能帮忙 情景 WPF应用程序调用wcf服务来购买产品等。。。 客户可以在UI中选择20种产品并按buy键,现在对于处理的每种产品,我需要报告一个状态,例如(“OK”、“缺货”、“忙碌”等) 我有一个绑定到BuyCommand的txtReportProgress 问题 尽管一切似乎都正常,我收到了处理的每个产品的通知,但它完全不同步,并且没有按照正确的顺序报告步骤。 我认为这是因为我没有实现线程,但我不知道如何实现它。 我已经读到我可以使用“Dispatcher”I/o后台工作程序,但无法使

希望你能帮忙

情景 WPF应用程序调用wcf服务来购买产品等。。。 客户可以在UI中选择20种产品并按buy键,现在对于处理的每种产品,我需要报告一个状态,例如(“OK”、“缺货”、“忙碌”等) 我有一个绑定到BuyCommand的txtReportProgress

问题 尽管一切似乎都正常,我收到了处理的每个产品的通知,但它完全不同步,并且没有按照正确的顺序报告步骤。 我认为这是因为我没有实现线程,但我不知道如何实现它。 我已经读到我可以使用“Dispatcher”I/o后台工作程序,但无法使其工作。 这里的Noddy示例给您一个想法

你能帮我,给我一些建议吗

    ---CustomerViewModel
    public ICommand BuyCommand
    {
        get
        {
            if (BuyCommand == null)
            {
                BuyCommand = new RelayCommand(param => Buy(), param => CanBuy);
            }
            return BuyCommand;
        }
    }

    private  void Buy()
    {
        ReportProgress("Buying Progress is starting");

        ProductStatus status=myService.IsProductAvailable();

        myService.ProcessProducts();  //For each product that is processed service does a callback and NotificationReceivedfromService is fired.THIS WORKS!!            
        ReportProgress(status);

        var result =DoSomethingElse();

        ReportProgress(result);
    }
    void NotificationReceivedFromService(object sender, StatusEventArg e)
    {
        //update the UI
        ReportProgress(e.Message);
    }

     static bool CanBuy
    {
        get
        {
            return true; 
        } 
    }
    public string CustomerLog
    {
        get { return _customerModel.CustomerLog; }
        set
        {
            _customerModel.CustomerLog = value;
            base.OnPropertyChanged("CustomerLog");
        }
    }
    internal void ReportProgress(string text)
    {
        CustomerLog += text + Environment.NewLine;            
    }

什么是WCF通信通道?您是否同时向一个服务发出多个请求?我真的无法从您的代码中看出有任何多线程在进行,但我假设NotificationReceivedFromService是某种回调

无论如何,如果您使用的是Dispatcher.BeginInvoke之类的东西,那么只要调用具有相同的Dispatcher优先级,就应该按照调用的顺序执行调用


但是,如果您向服务发出多个并行请求,则无法真正控制它们完成的顺序。您需要发出一个请求,然后在第一个请求完成时发出下一个请求,等等。或者您可以更改您的设计,使其不依赖于操作顺序。

什么是WCF通信通道?您是否同时向一个服务发出多个请求?我真的无法从您的代码中看出有任何多线程在进行,但我假设NotificationReceivedFromService是某种回调

无论如何,如果您使用的是Dispatcher.BeginInvoke之类的东西,那么只要调用具有相同的Dispatcher优先级,就应该按照调用的顺序执行调用


但是,如果您向服务发出多个并行请求,则无法真正控制它们完成的顺序。您需要发出一个请求,然后在第一个请求完成时发出下一个请求,等等。或者您可以更改您的设计,使其不依赖于操作顺序。

当回调不同步时,显然正在进行一些多线程处理,可能您没有意识到这一点。您知道对WCF服务的调用可以由服务本身异步处理吗?阅读了解更多信息。如果您需要更多帮助,请详细说明您的问题或向我们展示更多代码。 至于调度员和后台工作人员,他们是非常不同的野兽:
Dispatcher.Invoke
用于从与UI线程不同的线程更新UI。
Backgroundworkers封装了在后台运行的任务,但很方便地在UI线程上抛出事件,因此不需要使用
Dispatcher.Invoke
调用。
您可以阅读更多关于BackgroundWorkers的信息

当您得到不同步的回调时,显然正在进行一些多线程处理,可能您没有意识到这一点。您知道对WCF服务的调用可以由服务本身异步处理吗?阅读了解更多信息。如果您需要更多帮助,请详细说明您的问题或向我们展示更多代码。 至于调度员和后台工作人员,他们是非常不同的野兽:
Dispatcher.Invoke
用于从与UI线程不同的线程更新UI。
Backgroundworkers封装了在后台运行的任务,但很方便地在UI线程上抛出事件,因此不需要使用
Dispatcher.Invoke
调用。
您可以阅读有关BackgroundWorkers的更多信息,如前所述,回调是异步的,因此您将遇到排序问题。您能否以某种方式安排对服务的调用,以便带回一些令牌或其他标识符,帮助您以正确的顺序报告进度?您可以根据什么进行排序?

如前所述,回调是异步的,因此您将遇到排序问题。您能否以某种方式安排对服务的调用,以便带回一些令牌或其他标识符,帮助您以正确的顺序报告进度?您可能可以根据什么进行排序?

从服务接收的通知是回调。没有任何线程正在进行,因为我不知道如何实现它,我需要一些指针或快速而肮脏的代码片段来钩住dispatecher。秩序是至关重要的!。我必须通知UI,例如(Step1 ok,Step2 ok等)。在现实世界中,同时会有许多请求,但每个请求都必须有自己的顺序(Step1 Started,Step1Completed等)。同样,需要实现线程,但需要一个起点。如何将dispather挂接到触发所有进程的方法“Buy”上?谢谢,洛蒂建议在这种情况下不要直接使用调度器。我会推荐BackgroundWorker。有什么具体原因吗?只是为了让我理解你的理由哇,很抱歉延迟回复。我错过了你的评论。我推荐BackgroundWorker的原因是,它很好地隐藏了做后台工作和向UI线程发送定期通知的复杂性。使用Dispatcher只会让您进入前台线程,但仍然让您进入后台线程。NotificationReceivedFromService是一个回调。没有任何线程正在进行,因为我不知道如何实现它,我需要一些指针或快速而肮脏的代码片段来钩住dispatecher。秩序是至关重要的!。我必须通知用户界面,例如(Step1 ok,Step2 ok等)。在现实世界中,同时会有许多请求,但每个请求必须有自己的顺序(Step1 Started,Step1Completed等),需要再次执行