如何实现 TPL 以在 1 分钟延迟后运行进程
本文关键字:分钟 延迟 进程 运行 以在 TPL 何实现 实现 | 更新日期: 2023-09-27 18:34:05
我需要对以下情况的一些建议。我们有两个 API,比如 API1 和 API2。API1 从 API2 调用方法。有时 API1 无法联系 API2。但是 API1 过去如果无法联系 API2,它会尝试三次。三次后,如果 API1 无法联系 API2,我们决定添加 1 分钟延迟,然后重试。 API1 不应依赖于此 1 分钟延迟的进程结果。它应该向用户返回一个响应,例如"请检查电子邮件以获取结果"。 为此,我们尝试了
TPL(任务并行库)
使用 TPL 时,API1 等待完成任务,然后仅返回结果。
线程
我们尝试了线程池,但它是老式的。
.NET Framework 4.0
这里 API1 的代码实现了 TPL
public string TestTPL()
{
string str = string.Empty;
int i = 1;
ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client();
while (i <= 3)
{
//call a method resides in API2
string str = obj.API2Method();
if (string.IsNullOrEmpty(str))
i++;
else
break;
}
if (string.IsNullOrEmpty(str))
Parallel.Invoke(() => DoSomeWork());
return "Hey, I came";
}
public void DoSomeWork()
{
//wait for 1 min
System.Threading.Thread.Sleep(60000);
ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client();
//call a method resides in API2
string str = obj.API2Method();
//send mail to the user
}
要运行独立于父方法的子任务,我们可以使用 Task 类。
public string TestTPL() //parent method
{
Task task = new Task(DoSomeWork); //child task
task.Start();
return "Hey, I came";
}
任务可以获取自己的专用线程,并且不使用池中的线程。在 Parallel.Invoke 的情况下,父方法会等到子任务完成。
Parallel.Invoke() 是一个同步调用,这意味着它不会返回,直到它的所有子级都完成。在这种情况下,它将等到 DoSomWork() 完成。
而不是
if (string.IsNullOrEmpty(str))
Parallel.Invoke(() => DoSomeWork());
尝试类似的东西
if (string.IsNullOrEmpty(str))
Task.Run(() => DoSomeWork());
这将立即返回并在线程池中的线程上执行 DoSomeWork()。
线程池很旧,但它仍然是一个很好的工具。TPL只是为您提供了一些更好的语义来表达在更高层次上正在完成的工作,而不是如何在幕后完成。
Task.Wait(60000).Run( () => {
} );