C# WCF仅在满足特定条件或等待时调用方法
我有一个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,此过程非常耗时(比如,大约需要
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
>我是否需要为这些方法中的每一个实现一个重复的异步方法?