我有一个基本的buddylist类型应用程序,它是WCF中的发布/订阅交易。我的问题是一个或两个调用长时间运行,这会阻塞整个服务器应用程序(gui更新等)。
这是我的代码:
[ServiceContract(SessionMode = SessionMode.Required,
CallbackContract = typeof(IBuddyListContract))]
public interface IBuddyListPubSubContract
{
[OperationContract]
string GetABunchOfDataZipped(String sessionId); // this can take > 20 seconds
....
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class BuddyListPubSubContract : IBuddyListPubSubContract
{
string GetABunchOfDataZipped(String sessionId)
{
// do some calculations and data retrival
return result;
}
}
到目前为止,我对如何解决这个问题有了一个想法,但有更简单的方法吗?
创意1 :GetCounchOfDataZipped(String sessionId)是一个空白,当它完成时我的双工合同上有另一个端点。我不喜欢这种情况,好像我的架构发生了根本性的变化,如果字符串是一个缓慢的互联网连接上的大块文本,它仍然会遇到同样的问题?
答案 0 :(得分:2)
我的问题是一个或两个调用长时间运行,这会阻塞整个服务器应用程序(gui更新等)。
你不清楚你在哪里看到阻止行为,但听起来它会在客户端。您应该从后台线程而不是UI线程调用WCF服务。然后,当您处理结果时,您将无法直接与UI元素交互,您将需要使用每个控件的Invoke
方法。