WCF 仅在满足特定条件时调用方法,否则等待
Posted
技术标签:
【中文标题】WCF 仅在满足特定条件时调用方法,否则等待【英文标题】:WCF Invoke method only if certain condition is satisfied or else wait 【发布时间】:2017-10-16 08:11:14 【问题描述】:我有一个实现ServiceContract
的 WCF 服务。为简单起见,说ServiceContract
只有一种方法:
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
时,我可以运行/启动这个暂停的任务。
我在考虑任务,因为我不想阻止主线程执行 AddNewData
的其他值 arg1
。
现在我不确定如何在输入给定值arg1
的方法之前决定是否要启动AddNewData
。据我了解,进入该方法后我无法暂停AddNewData
的执行,因为它会阻塞主线程。我查看了IDispatchMessageInspector.AfterReceiveRequest ,但不知道如何利用它。
任何人对我应该如何处理有任何建议。我是 WCF 和多线程的新手,所以如果我在这里遗漏了什么,请见谅。
【问题讨论】:
【参考方案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/
它包含一个完整的例子
【讨论】:
方法AddNewDataAsync
如何获得WCF的调用?我的主要问题是在 WCF 调用 AddNewData
之前将调用发送到像 AddNewDataAsync
这样的方法。
我不确定你在问什么。 AddNewDataAsync 调用 AddNewData 而不是相反。
在您的代码中,当前执行 AddNewData 的代码是什么?你说这是在主线程上。我假设它是对某些 GUI 操作的响应?也许如果您提供比单个界面更多的上下文,那么您在寻找什么会更清楚。
WCF 服务实现ServiceContract
,因此包含AddNewData
的实现。 IIS 调用 WCF 服务,根据合同将调用AddNewData
而不是AddNewDataAsync
。如果我错了,请纠正我。
另外,实际的ServiceContract
包含许多类似于AddNewData
的方法,比如GetData
、UpdateData
、DeleteData
等。我需要为这些方法中的每一个实现一个重复的异步方法吗?以上是关于WCF 仅在满足特定条件时调用方法,否则等待的主要内容,如果未能解决你的问题,请参考以下文章