【问题标题】:WCF Invoke method only if certain condition is satisfied or else waitWCF 仅在满足特定条件时调用方法,否则等待
【发布时间】:2017-10-16 08:11:14
【问题描述】:

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

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

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

我在想,因为AddNewData 是调用的入口点,我想我希望能够创建执行AddNewDataTask 但在arg1 == val1 的情况下,我不执行任务但是让它暂停(处于未启动状态),当从Database1 切换到Database2 时,我可以运行/启动这个暂停的任务。 我在考虑任务,因为我不想阻止主线程执行 AddNewData 的其他值 arg1

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

任何人对我应该如何处理有任何建议。我是 WCF 和多线程的新手,所以如果我在这里遗漏了什么,请见谅。

【问题讨论】:

    标签: c# multithreading wcf async-await


    【解决方案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 的方法,比如GetDataUpdateDataDeleteData 等。我需要为这些方法中的每一个实现一个重复的异步方法吗?
    猜你喜欢
    • 2016-09-17
    • 2013-02-21
    • 2019-05-06
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多