WCF 服务:从中调用第一个函数 return,然后调用第二个函数在后台工作
WCF Service: Call first function, return from it, then call second function to work in background
我正在编写一个 WCF 服务,其中我必须调用两个函数来更新数据库,但我想在第一次 table 更新后 return,这样客户端就不会等待更长的时间,然后再等待第二次table 将在后台更新。
我想做的事情是这样的:
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(动作动作)
来自:https://msdn.microsoft.com/en-us/library/hh195051(v=vs.110).aspx
Queues the specified work to run on the thread pool and returns a Task object that represents that work.
基本上,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 的结果 return 所需的 bool 值。
当您调用 task.Wait() 或 task.Result 时,您的方法基本上会暂停,直到任务已完成 - 在本例中,它会等待 table1 更新。
现在 - 您会注意到我们没有变量来存储 UpdateTable2 的任务状态 - 这是因为您不关心结果。由于没有存储变量,我们永远不会阻止调用线程来查看结果——这意味着您实际上已经获得了一个 "Fire and Forget" 方法。
希望这有助于澄清一点——但如果没有,那里有很多资源可以提供帮助,请查看异步和并行编程,因为会有人比我解释得更清楚。
以下内容对我有用:
mcsd-certification-toolkit-exam-70-483
我还将您的方法名称从 Camel Case 转换为 Pascal Case,因为这是标准做法。
我正在编写一个 WCF 服务,其中我必须调用两个函数来更新数据库,但我想在第一次 table 更新后 return,这样客户端就不会等待更长的时间,然后再等待第二次table 将在后台更新。
我想做的事情是这样的:
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(动作动作)
来自:https://msdn.microsoft.com/en-us/library/hh195051(v=vs.110).aspx
Queues the specified work to run on the thread pool and returns a Task object that represents that work.
基本上,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 的结果 return 所需的 bool 值。
当您调用 task.Wait() 或 task.Result 时,您的方法基本上会暂停,直到任务已完成 - 在本例中,它会等待 table1 更新。
现在 - 您会注意到我们没有变量来存储 UpdateTable2 的任务状态 - 这是因为您不关心结果。由于没有存储变量,我们永远不会阻止调用线程来查看结果——这意味着您实际上已经获得了一个 "Fire and Forget" 方法。
希望这有助于澄清一点——但如果没有,那里有很多资源可以提供帮助,请查看异步和并行编程,因为会有人比我解释得更清楚。
以下内容对我有用:
mcsd-certification-toolkit-exam-70-483
我还将您的方法名称从 Camel Case 转换为 Pascal Case,因为这是标准做法。