【问题标题】:C# WCF NetTCPBinding Blocking ApplicationC# WCF NetTCPBinding 阻塞应用程序
【发布时间】:2011-05-31 19:07:56
【问题描述】:

我有一个基本的好友列表类型应用程序,它是 WCF 中的 pub/sub 交易。我的问题是一两个调用长时间运行,这会阻塞整个服务器应用程序(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:让 GetABunchOfDataZipped(String sessionId) 成为无效,当它完成时,在我命中的双工合同上有另一个端点。我不喜欢这样,因为如果我的架构发生了根本性的变化,并且如果字符串是通过慢速互联网连接的大块文本,它仍然会遇到同样的问题吗?

【问题讨论】:

    标签: c# wcf nettcpbinding


    【解决方案1】:

    我的问题是一两个调用长时间运行,这会阻塞整个服务器应用程序(gui 更新等)。

    您不清楚在哪里看到了阻塞行为,但听起来好像是在客户端。您应该从后台线程而不是 UI 线程调用 WCF 服务。那么当你处理结果时,你将无法直接与你的 UI 元素交互,你需要使用每个控件的 Invoke 方法。

    【讨论】:

    • 我目前在加载事件的 UI 线程中创建 ServiceHost。我应该在后台线程中创建它吗?
    • 阻塞行为也在服务器中。客户端调用后台线程中的所有方法。
    • @nextgenneo 如果您在 UI 线程上创建 ServiceHost,是的,默认情况下它只会处理 UI 线程上的请求。但是,您可以在您的服务实现类上设置[ServiceBehavior(UseSynchronizationContext=false)],这将导致来自线程池的工作线程处理请求。有关完整说明,请参阅code-magazine.com/article.aspx?quickid=0701041&page=3
    猜你喜欢
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    相关资源
    最近更新 更多