希望你能提供帮助。
情景 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;
}
答案 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是异步的,因此您将遇到排序问题。您是否可以通过某种方式安排对服务的调用,以便您可以带回一些令牌或其他标识符,以帮助您按正确的顺序报告进度?你可以选择哪种东西?