c# - WCF 仅在满足特定条件时调用方法,否则等待

标签 c# multithreading wcf async-await

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

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

这里AddNewData可以添加数据到Database1或者Database2,具体取决于 arg1 的值。在某个时间点,对于 arg1 的给定值,比如 val1,我们正在尝试将存储从 Database1 切换到 Database2 这个过程很耗时(比如说,大约需要一分钟)。在此期间,所有对 arg1 == val1 的调用都应暂停,但我们仍应能够对 arg1 的所有其他值执行 AddNewData > 即我们不应该阻塞主线程。

我在想,因为 AddNewData 是调用的入口点,我想我希望能够创建执行 AddNewDataTask但是在 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"
    }
}

以上内容无耻地从

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

它包含一个完整的例子

关于c# - WCF 仅在满足特定条件时调用方法,否则等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44015111/

相关文章:

c# - 检测网络流上正在进行的写操作

c# - 运行局域网 WCF 服务

c# - 获取数组的平均值

c# - Puppeteer-Sharp 库没有工作,也没有在 web 服务 (wcf) 项目中创建页面

java - 如何在java中暂停预先实现的Runnable类?

c# - 使用 WCF 客户端 + cookie 进行 Web 服务调用

asp.net - WCF 服务与 ASP.NET Web Api

c# - 刷新表单及其所有子项

c# - 使用 "using"语法时出现流关闭错误

java - 快速写入 JEditorPane