Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF仅在满足特定条件或等待时调用方法_C#_Multithreading_Wcf_Async Await - Fatal编程技术网

C# WCF仅在满足特定条件或等待时调用方法

C# WCF仅在满足特定条件或等待时调用方法,c#,multithreading,wcf,async-await,C#,Multithreading,Wcf,Async Await,我有一个WCF服务,它实现了一个ServiceContract。为了简单起见,假设ServiceContract只有一种方法: public interface ServiceContract { String AddNewData(T arg1); } 此处AddNewData可以根据需要将数据添加到Database1或Database2 arg1的值。对于给定的arg1值(比如val1),我们正在尝试将存储从Database1切换到Database2,此过程非常耗时(比如,大约需要

我有一个WCF服务,它实现了一个
ServiceContract
。为了简单起见,假设
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
时,我可以运行/启动这个挂起的任务。 我考虑的是任务,因为我不想阻止主线程对
arg1
的其他值执行
AddNewData

现在,在输入给定值
arg1
的方法之前,我不知道如何决定是否启动
AddNewData
。根据我的理解,我不能在输入方法后暂停执行
AddNewData
,因为它会阻塞主线程。我调查了一下,但不知道如何利用这一点


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

只需使用异步服务契约即可

[ServiceContract]
public interface IServiceContract<T>
{
    [OperationContract]
    Task<string> AddNewData(T arg1);
}
[服务合同]
公共接口电子合同
{
[经营合同]
任务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"
    }
}
const int val1=10;
公共类HelloService:IServiceContract
{
公共异步任务AddNewData(int arg1)
{
如果(arg1==val1){
//轮询以查看数据库是否已就绪
//或者使用其他返回
//准备好的任务
而(!(等待DataBaseReady())
等待任务延迟(时间跨度从秒(1));
}
返回“明白”
}
}
上述内容被无耻地剽窃


它包含了一个完整的示例

方法
AddNewDataAsync
如何从WCF获得调用?我的主要问题是在WCF调用
AddNewDataAsync
之前,将调用发送到一个类似
AddNewDataAsync
的方法。我不确定你在问什么。AddNewDataAsync正在调用AddNewData,而不是相反。在你的代码中hat代码当前执行AddNewData?您说这是在主线程上。我假设它是对某个GUI操作的响应??也许如果您提供比单个界面更多的上下文,那么您需要的内容就会更清楚。WCF服务实现
ServiceContract
,因此包含
a的实现ddNewData
。IIS调用WCF服务,根据合同将调用
AddNewData
,而不是
AddNewDataAsync
。如果我错了,请纠正我。此外,实际的
ServiceContract
包含许多类似于
AddNewData
的方法,比如
GetData
UpdateData
DeleteData
>我是否需要为这些方法中的每一个实现一个重复的异步方法?