首页 > 解决方案 > WCF服务:调用第一个函数,从它返回,然后调用第二个函数在后台工作

问题描述

我正在编写一个 WCF 服务,我必须在其中调用两个函数来更新数据库,但我想在第一个表更新后返回,以便客户端不应该等待更长时间,然后第二个表将在后台更新。

我想做的事情是这样的:

public bool myMainFunction(){

    bool result = updateTable1();

    return result;

    updateTable2();

}

我怎样才能做到这一点?

谢谢

标签: c#databasewcfsynchronous

解决方案


尝试这个

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 将您的项目排入线程池 - 这允许它异步运行。通常,您会将其与任务的WaitResult方法配对,以阻塞调用线程,直到任务完成 - 例如:

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,因为这是标准做法。


推荐阅读