仅当满足某些条件或等待时,WCF调用方法

时间:2017-05-17 03:37:21

标签: c# multithreading wcf async-await

我有一个实现ServiceContract的WCF服务。为简单起见,ServiceContract只有一种方法:

public interface ServiceContract
{
    String AddNewData(T arg1);
}

此处AddNewData可以将数据添加到Database1Database2,具体取决于 值arg1。在特定值arg1val1的某个时间点,我们正在尝试将存储从Database1切换到Database2,这个过程非常耗时(Say,大约需要一分钟)。在此期间,arg1 == val1的所有调用都应暂停,但我们仍然可以对AddNewData的所有其他值执行arg1,即我们不应该阻止主线程。< / p>

我在想,因为AddNewData是通话的入口点,我想我希望能够创建执行Task的{​​{1}}但是AddNewData ,我不执行任务但保持暂停状态(处于未启动状态),当从arg1 == val1切换到Database1时,我可以运行/启动此暂停的任务。 我在考虑任务方面,因为我不想阻止主线程为Database2的其他值执行AddNewData

现在我不确定如何在为arg1的给定值输入方法之前决定是否要启动AddNewData。根据我的理解,我不能在输入方法后暂停执行arg1,因为它会阻塞主线程。我调查了IDispatchMessageInspector.AfterReceiveRequest ,但无法弄清楚如何利用它。

任何有关如何解决这个问题的建议的人。我是WCF和多线程的新手,所以如果我在这里缺少一些东西,请原谅。

1 个答案:

答案 0 :(得分:1)

只需使用异步服务合同

[ServiceContract]
public interface IServiceContract<T>
{
    [OperationContract]
    Task<string> AddNewData(T arg1);
}

然后在服务器端

const int val1 = 10;

public class HelloService<int> : IServiceContract<T>
{
    public async Task<string> AddNewData(int arg1)
    {
      if(arg1==val1){
         // Poll to see if the database is ready
         // or use some other method that returns a 
         // a task when it is ready
         while(!(await DataBaseReady())
             await Task.Delay(TimeSpan.FromSeconds(1));
       }
       return "Got it"
    }
}

上面被无耻地从

中扯掉了

https://blogs.msdn.microsoft.com/endpoint/2010/11/12/simplified-asynchronous-programming-model-in-wcf-with-asyncawait/

它包含一个完整的例子