2

我需要一些关于以下情况的建议。我们有两个 API,比如说 API1 和 API2。API1 从 API2 调用一个方法。有时 API1 无法联系 API2。但是 API1 曾经尝试过 3 次,如果它无法联系到 API2。3 次后,API1 仍然无法联系到 API2,我们决定增加 1 分钟延迟再试一次。API1 不应依赖于这 1 分钟延迟的处理结果。它应该向用户返回一个响应,例如“请检查电子邮件以获取结果”。为此,我们尝试了

TPL(任务并行库

在使用 TPL 时,API1 等待完成任务,然后才返回结果。

穿线

我们尝试了线程池,但它是老式的。

.NET 框架 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 

    }
4

3 回答 3

2

要运行独立于父方法的子任务,我们可以使用 Task 类。

   public string TestTPL()    //parent method
    {
        Task task = new Task(DoSomeWork);  //child task
        task.Start();
        return "Hey, I came";
    }

任务可以获得自己的专用线程,并且不消耗池中的线程。在 Parallel.Invoke 的情况下,父方法等到子任务完成。

于 2013-10-05T13:21:06.920 回答
0
Task.Wait(60000).Run( () => {

} );
于 2013-10-06T23:20:11.603 回答
0

Parallel.Invoke() 是一个同步调用,这意味着在其所有子代完成之前它不会返回。在这种情况下,它将等到 DoSomWork() 完成。

代替

if (string.IsNullOrEmpty(str))
            Parallel.Invoke(() => DoSomeWork());

尝试类似的东西

if (string.IsNullOrEmpty(str))
             Task.Run(() => DoSomeWork());

这将立即返回并在线程池中的线程上执行 DoSomeWork()。

线程池很旧,但它仍然是一个很好的工具。TPL 只是为您提供了一些更好的语义来表达在更高级别上完成的工作,而不是在幕后完成工作的方式。

于 2013-10-06T22:57:54.153 回答