2012-09-07 201 views
0

我正在使用我的Silverlight 5应用程序的WCF服务。耗时WCF服务调用阻止其他WCF服务调用。

在我的一个服务电话中,我正在做一个耗时的工作。完成活动需要1到2分钟的时间。我不会阻塞繁忙指标的用户界面,因此用户仍然可以与应用程序进行交互。

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

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

WebService的代码

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

CS

client.PerformFileScanAsnc(docId); 
client.PerformFileScanCompleted += new EventHandler<.PerformFileScanCompletedEventArgs>(client_PerformFileScanCompleted); 

回答

0

你有两个选择:

  1. 请在服务器端您的通话异步的。您可以使用TPL,只是喜欢写东西Task.Factory.StartNew(...)
  2. 您可以用ServiceBehavior属性装饰你的服务实现,并设置ConcurrencyModeMultiple

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

然后WCF将安排为您服务电话在平行下。但是,你必须确保你的服务代码是线程安全的!