向多个WCF服务(MVVM)发送/接收消息时WPF应用程序锁定

向多个WCF服务(MVVM)发送/接收消息时WPF应用程序锁定,wcf,mvvm,Wcf,Mvvm,我正在为我的应用程序的正确架构而挣扎。尤其是在UI锁定方面有问题,我不知道为什么。我有两个应用程序,它们都运行着需要相互对话的服务 无论以哪种方式发送消息,我每次都会创建一个新的通道工厂 客户端每15秒向服务器发送一次消息。根据命令,服务器向客户端发送消息(一次一条)。理论上,服务器可能会不断地从多个客户端接收消息,因此需要像Web服务器一样扩展,同时仍保持UI响应 问题是过了一段时间,我的UI锁定了,有时在服务器上,有时在客户机上。我很确定这是由于WCF(还有很多其他的东西在进行) 如果我尝试

我正在为我的应用程序的正确架构而挣扎。尤其是在UI锁定方面有问题,我不知道为什么。我有两个应用程序,它们都运行着需要相互对话的服务

无论以哪种方式发送消息,我每次都会创建一个新的通道工厂

客户端每15秒向服务器发送一次消息。根据命令,服务器向客户端发送消息(一次一条)。理论上,服务器可能会不断地从多个客户端接收消息,因此需要像Web服务器一样扩展,同时仍保持UI响应

问题是过了一段时间,我的UI锁定了,有时在服务器上,有时在客户机上。我很确定这是由于WCF(还有很多其他的东西在进行)

如果我尝试通过创建频道(通过channelfactory)、发送消息然后关闭频道工厂来发送消息,则需要一分钟的时间才能发送消息(同时两个应用程序上的UI都被锁定)。如果我在发送消息后关闭channelFactory.close(),则消息会立即被发送

我创建的服务具有SendMessage方法的
[OperationContract(IsOneWay=true)]
。我的服务的实现具有
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]


为什么在最后使用channelFactory.close()时需要一分钟才能发送我的消息?

在大多数情况下,您不应该在UI线程上通过网络发送消息。这就是导致应用程序锁定的原因。我不明白为什么web服务调用要花费1分钟的时间-可能只是UI线程正在排队等待消息。让我们先解决线程问题,看看这是否会缩短请求时间

您不必担心接收消息,因为WCF将启动一个线程来接收和处理消息,但是当您发送消息时,该线程将阻塞,直到消息被发送并确认为止

要在非UI线程上发送消息,请使用任务并行库:

Task t = Task.Factory.StartNew(() =>
{
    //Do web service call here
});
如果您需要在消息发送后更新UI,请按照上面的代码执行以下操作:

Task UITask= t.ContinueWith(() =>
{
 this.TextBlock1.Text = "Complete"; 
}, TaskScheduler.FromCurrentSynchronizationContext());

太棒了,完成了谢谢Greg!在我的本地机器测试中,几乎可以立即发送和接收消息。如果您能了解一下为什么使用此解决方案而不是异步调用WCF服务,我将不胜感激?另外,如果服务启动一个线程来接收消息,我通常不会在同时接收几十条消息时遇到问题?(即,它们不是按顺序处理的)很高兴听到您的问题得到解决:)我们正在做的是异步调用服务,但它使用.NET framework(TPL)而不是WCF框架来实现这一点。TPL为多线程提供了更大的灵活性,并且适用于一切(而不仅仅是web服务)。在过去,每个数据访问框架(ADO.NET、WebServices等)都有自己的异步非标准机制。