我有這個奇怪的問題,當我的客戶端將從我的WCF服務調用方法時掛起。現在真正奇怪的是,當客戶端是控制檯應用程序時,不會發生這種情況。它發生在客戶端是WinForm或WPF應用程序時。從服務調用方法WCF客戶端凍結
我創建了一個WCF客戶端可以使用連接到服務的客戶端庫,在這裏看到:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel; //needed for WCF communication
namespace DCC_Client
{
public class DCCClient
{
private DuplexChannelFactory<ServiceReference1.IDCCService> dualFactory;
public ServiceReference1.IDCCService Proxy;
public DCCClient()
{
//Setup the duplex channel to the service...
NetNamedPipeBinding binding = new NetNamedPipeBinding();
dualFactory = new DuplexChannelFactory<ServiceReference1.IDCCService>(new Callbacks(), binding, new EndpointAddress("net.pipe://localhost/DCCService"));
}
public void Open()
{
Proxy = dualFactory.CreateChannel();
}
public void Close()
{
dualFactory.Close();
}
}
public class Callbacks : ServiceReference1.IDCCServiceCallback
{
void ServiceReference1.IDCCServiceCallback.OnCallback(string id, string message, Guid key)
{
Console.WriteLine(string.Format("{0}: {1}", id, message));
}
}
}
下面是工作 WCF控制檯客戶端代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DCC_Client;
namespace Client_Console_Test
{
class Program
{
private static DCCClient DCCClient;
static void Main(string[] args)
{
try
{
DCCClient = new DCCClient();
DCCClient.Open();
DCCClient.Proxy.DCCInitialize(); //returns fine from here
Console.ReadLine();
DCCClient.Proxy.DCCUninitialize();
DCCClient.Close();
}
catch (Exception e)
{
throw;
}
}
}
}
這裏是WPF客戶端的代碼凍結(看評論)
using System; //etc
using DCC_Client; //Used for connection to DCC Service
namespace Client_WPF_Test
{
public partial class Main : Window
{
private static DCCClient DCCClient;
public Main()
{
InitializeComponent();
DCCClient = new DCCClient();
DCCClient.Open();
}
private void Connect_btn_event() {
try
{
DCCClient.Proxy.DCCInitialize(); //**never returns from this**
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
我進入了代碼DCCClient.Proxy.DCCInitialize();
,服務成功執行了這些命令,但是由於某些原因,客戶端卡在這裏並且不會繼續執行。客戶端不會例外,並且堆棧跟蹤顯示[外部代碼]。
這就是說,控制檯客戶端運行完美。我想我在這裏錯過了一些簡單的東西。我感謝您提供的任何幫助。
感謝拉迪斯拉夫您的快速回復。我的回撥在我的合同中已經有'[OperationContract(IsOneWay = true)]'。我嘗試在我的Callback實現中添加'[CallbackBehavior(ConcurrencyMode = ConcurrencyModel.Reentrant)]'並且客戶端仍然會凍結。然後我使用了'[CallbackBehavior(UseSynchronizationContext = false)]',它工作!是否有任何安全問題,我應該知道,因爲它是在一個不同的線程? – 2011-06-01 19:31:41
我在描述中添加了我的答案。 – 2011-06-01 19:38:44
+1。在嘗試了其他一些事情之後,'[CallbackBehavior(UseSynchronizationContext = false)]'也是我的問題的解決方案。 – 2015-05-21 09:41:33