我有一个实现ServiceContract
的WCF服务。为简单起见,ServiceContract
只有一种方法:
public interface ServiceContract
{
String AddNewData(T arg1);
}
此处AddNewData
可以将数据添加到Database1
或Database2
,具体取决于
值arg1
。在特定值arg1
说val1
的某个时间点,我们正在尝试将存储从Database1
切换到Database2
,这个过程非常耗时(Say,大约需要一分钟)。在此期间,arg1 == val1
的所有调用都应暂停,但我们仍然可以对AddNewData
的所有其他值执行arg1
,即我们不应该阻止主线程。< / p>
我在想,因为AddNewData
是通话的入口点,我想我希望能够创建执行Task
的{{1}}但是AddNewData
,我不执行任务但保持暂停状态(处于未启动状态),当从arg1 == val1
切换到Database1
时,我可以运行/启动此暂停的任务。
我在考虑任务方面,因为我不想阻止主线程为Database2
的其他值执行AddNewData
。
现在我不确定如何在为arg1
的给定值输入方法之前决定是否要启动AddNewData
。根据我的理解,我不能在输入方法后暂停执行arg1
,因为它会阻塞主线程。我调查了IDispatchMessageInspector.AfterReceiveRequest ,但无法弄清楚如何利用它。
任何有关如何解决这个问题的建议的人。我是WCF和多线程的新手,所以如果我在这里缺少一些东西,请原谅。
答案 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"
}
}
上面被无耻地从
中扯掉了它包含一个完整的例子