c# - WCF服务:调用第一个函数,从它返回,然后调用第二个函数在后台工作
问题描述
我正在编写一个 WCF 服务,我必须在其中调用两个函数来更新数据库,但我想在第一个表更新后返回,以便客户端不应该等待更长时间,然后第二个表将在后台更新。
我想做的事情是这样的:
public bool myMainFunction(){
bool result = updateTable1();
return result;
updateTable2();
}
我怎样才能做到这一点?
谢谢
解决方案
尝试这个
using System.Threading.Tasks;
public bool MyMainFunction()
{
bool result = UpdateTable1();
Task.Run(() => UpdateTable2());
return result;
}
Task.Run(Action action)
来自:https ://msdn.microsoft.com/en-us/library/hh195051(v=vs.110).aspx
将指定的工作排入队列以在线程池上运行,并返回一个表示该工作的 Task 对象。
基本上,Task.Run 将您的项目排入线程池 - 这允许它异步运行。通常,您会将其与任务的Wait或Result方法配对,以阻塞调用线程,直到任务完成 - 例如:
using System.Threading.Tasks;
public bool MyMainFunction()
{
Task<bool> task = Task.Run(() => UpdateTable1());
Task.Run(() => UpdateTable2());
return task.Result;
}
在前面的例子中——这两种方法现在都在线程池中排队——这意味着它们可以并行执行。(在第一个示例中 - UpdateTable1 必须在 UpdateTable2 开始之前完成 - 但我们解雇并忘记了 UpdateTable2 - 所以它无关紧要)。新示例现在允许 UpdateTable2 在 UpdateTable1 完成之前开始执行。但是 - 我们现在有一个问题 - 因为我们需要等待 UpdateTable1 的结果返回所需的布尔值。
当您调用task.Wait()或task.Result时,您的方法基本上会暂停,直到任务完成 - 在这种情况下,它会等到 table1 更新。
现在 - 你会注意到我们没有一个变量来存储 UpdateTable2 的任务状态 - 这是因为你不关心结果。由于没有存储变量,我们永远不会阻塞调用线程来查看结果——这意味着您实际上已经获得了“一劳永逸”的方法。
希望这有助于澄清一点 - 但如果没有大量资源可以提供帮助,请查看异步和并行编程,因为会有人可以比我更清楚地解释。
以下对我有用:
mcsd-certification-toolkit-exam-70-483
我还将您的方法名称从 Camel Case 转换为 Pascal Case,因为这是标准做法。
推荐阅读
- android - 多个并行 AsyncTask 运行完成后如何执行指令?
- amazon-web-services - IAM 角色和 EC2 对用户身份的访问
- java - 用于发送文件的 Whatsapp 图标剪辑
- java - Maven Surefire 似乎无法正常工作
- javascript - 如何动画滚动图像(制作 3d 动画图像)?
- javascript - 为什么在向我的变量添加字符时,此字符串反转循环会提示“NaN”?
- java - 如何使用画布数据 API
- netcat - Netcat - 回显来自服务器的响应
- c - 检测非阻塞套接字中的空闲连接
- xamarin.forms - 自定义相机渲染器未在 UIImagePickerControllerDelegate 中回调回调