WCF服务:调用第一个函数,从中返回,然后调用第二个函数在后台工作

时间:2018-05-09 13:57:52

标签: c# database wcf synchronous

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

我想做的事情是这样的:

{{1}}

我怎样才能做到这一点?

由于

1 个答案:

答案 0 :(得分:0)

试试这个

using System.Threading.Tasks;

public bool MyMainFunction()
{
    bool result = UpdateTable1();

    Task.Run(() => UpdateTable2());

    return result;    
}

Task.Run(行动) 来自:https://msdn.microsoft.com/en-us/library/hh195051(v=vs.110).aspx

  

将指定的工作排队以在线程池上运行,并返回表示该工作的Task对象。

基本上,Task.Run将您的项目排队在线程池上 - 这允许它以异步方式运行。通常,您可以将其与任务的等待结果方法配对,以阻止调用线程,直到任务完成为止 - 例如:

using System.Threading.Tasks;

public bool MyMainFunction()
{
    Task<bool> task = Task.Run(() => UpdateTable1());

    Task.Run(() => UpdateTable2());

    return task.Result;
}

在前面的示例中 - 两个方法现在都在Threadpool上排队 - 这意味着它们可以并行执行。 (在第一个例子中 - UpdateTable1必须在UpdateTable2开始之前完成 - 但我们解雇并忘记了UpdateTable2 - 所以这是无关紧要的)。新示例现在允许UpdateTable2在 UpdateTable1完成之前开始执行。但是 - 我们现在有一个问题 - 因为我们需要等待UpdateTable1的结果返回所需的bool值。

当您调用 task.Wait() task.Result 时,您的方法基本上会暂停,直到任务完成 - 在这种情况下,它会一直等到table1已更新。

现在 - 您会注意到我们没有用于存储UpdateTable2任务状态的变量 - 这是因为您不关心结果。由于没有存储变量,我们不会阻止调用线程查看结果 - 这意味着您已经有效地获得了“Fire and Forget”方法。

希望这有助于清除它 - 但如果没有足够的资源可以提供帮助,请查看异步和并行编程,因为那里会有人比我更清楚地解释。

以下对我有用:
mcsd-certification-toolkit-exam-70-483

我还将你的方法名称从Camel Case转换为Pascal Case,因为这是标准做法。