需要WPF线程帮助

时间:2010-02-27 08:20:06

标签: c# .net wpf

希望你能提供帮助。

情景 WPF应用程序调用wcf服务购买产品等... 客户可以在UI中选择20个产品并按下购买,现在对于每个处理过的产品,我需要报告状态EG(“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;            
    }

3 个答案:

答案 0 :(得分:0)

什么是WCF通信渠道?您是否并行向服务发出多个请求?我无法从你的代码中看到有任何多线程发生的事情,但我假设NotificationReceivedFromService是某种回调?

无论如何,如果你使用像Dispatcher.BeginInvoke这样的东西,你的调用应该按照它们的顺序执行,只要它们都具有相同的调度程序优先级。

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

答案 1 :(得分:0)

当你的回调不同步时,显然有些多线程正在进行,也许你没有意识到它。您是否知道可以通过服务本身异步处理对WCF服务的调用?有关详细信息,请阅读here。如果您需要更多帮助,请详细说明您的问题或向我们展示更多代码。

对于Dispatchers和BackgroundWorkers来说,这些是非常不同的野兽:
Dispatcher.Invoke用于从与UI线程不同的线程更新UI Backgroundworkers封装了在后台运行的任务,但是方便地在UI线程上抛出了事件,因此不必使用Dispatcher.Invoke调用。

您可以阅读有关BackgroundWorkers here

的更多信息

答案 2 :(得分:0)

如上所述,CallBack是异步的,因此您将遇到排序问题。您是否可以通过某种方式安排对服务的调用,以便您可以带回一些令牌或其他标识符,以帮助您按正确的顺序报告进度?你可以选择哪种东西?