耗时的WCF服务调用会阻止其他WCF服务调用。

耗时的WCF服务调用会阻止其他WCF服务调用。,wcf,silverlight,web-services,wcf-data-services,Wcf,Silverlight,Web Services,Wcf Data Services,我在Silverlight 5应用程序中使用WCF服务 在我的一次服务电话中,我正在做一项耗时的工作。完成活动需要1到2分钟。我没有用繁忙的指示器阻塞UI,因此用户仍然可以与应用程序交互 问题是,当我进行第一次服务调用时,它会执行一些耗时的操作。当用户加载其他服务时,在第一个服务完成之前,不会处理我的第二个服务调用 如何在单独的线程中执行耗时的服务调用以避免其他线程 正在等待此服务完成的呼叫 Web服务代码 [ServiceContract(Namespace = "")] [AspNetCom

我在Silverlight 5应用程序中使用WCF服务

在我的一次服务电话中,我正在做一项耗时的工作。完成活动需要1到2分钟。我没有用繁忙的指示器阻塞UI,因此用户仍然可以与应用程序交互

问题是,当我进行第一次服务调用时,它会执行一些耗时的操作。当用户加载其他服务时,在第一个服务完成之前,不会处理我的第二个服务调用

如何在单独的线程中执行耗时的服务调用以避免其他线程 正在等待此服务完成的呼叫

Web服务代码

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestService
{[OperationContract]
    public bool PerformFileScan(int fileID)
    {
    //Time Consuming Process
    }
}
cs

client.PerformFileScanAsnc(docId);
client.PerformFileScanCompleted+=新事件处理程序(client\u PerformFileScanCompleted);
您有两个选择:

  • 使您的呼叫在服务器端异步。您可以使用TPL编写类似于
    Task.Factory.StartNew(…)
  • 您可以使用
    servicebhavior
    属性装饰服务实现,并将
    ConcurrencyMode
    设置为
    Multiple

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]    
    public class YourService
    {
    
    }
    
  • 然后wcf将安排对您的服务的并行调用。但是,您必须确保您的服务代码是线程安全的

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]    
    public class YourService
    {
    
    }