如何在延迟1分钟后实施TPL运行流程?

时间:2013-10-05 11:28:10

标签: c# multithreading api task-parallel-library threadpool

我需要就以下情况提出一些建议。我们有两个API,比如API1和API2。 API1从API2调用方法。有时API1无法联系API2。但是,如果无法联系API2,API1曾尝试过三次。三次之后,如果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 

    }

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

而不是

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

尝试类似

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

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

线程池虽旧但它仍然是一个很好的工具。 TPL只是为您提供了一些更好的语义来表达在更高层次上完成的工作,而不是如何在封面下完成。

答案 2 :(得分:0)

Task.Wait(60000).Run( () => {

} );