我有一个实现 ServiceContract
的 WCF 服务。为了简单起见,假设 ServiceContract
只有 1 个方法:
public interface ServiceContract
{
String AddNewData(T arg1);
}
这里AddNewData
可以添加数据到Database1
或者Database2
,具体取决于
arg1
的值。在某个时间点,对于 arg1
的给定值,比如 val1
,我们正在尝试将存储从 Database1
切换到 Database2
这个过程很耗时(比如说,大约需要一分钟)。在此期间,所有对 arg1 == val1
的调用都应暂停,但我们仍应能够对 arg1
的所有其他值执行 AddNewData
> 即我们不应该阻塞主线程。
我在想,因为 AddNewData
是调用的入口点,我想我希望能够创建执行 AddNewData
的 Task
但是在 arg1 == val1
的情况下,我不执行任务,而是将其保持暂停状态(处于未启动状态),并且当从 Database1
切换到 时Database2
已经发生,我可以运行/启动这个挂起的任务。
我在考虑任务,因为我不想阻止主线程为 arg1
的其他值执行 AddNewData
。
现在,我不确定如何在为 arg1
的给定值输入方法之前决定是否要启动 AddNewData
。根据我的理解,我不能在进入方法后暂停 AddNewData
的执行,因为它会阻塞主线程。我调查了IDispatchMessageInspector.AfterReceiveRequest 但不知道如何利用它。
任何人对我应该如何处理这件事有任何建议。我是 WCF 和多线程的新手,所以如果我在这里遗漏了一些直接的东西,请原谅。
最佳答案
只需使用异步服务契约(Contract)
[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"
}
}
以上内容无耻地从
它包含一个完整的例子
关于c# - WCF 仅在满足特定条件时调用方法,否则等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44015111/