调用方法,以便程序不会被阻止

时间:2016-04-11 15:30:29

标签: c# multithreading task-parallel-library

我需要在下面的C#代码中调用SendEmail(),这样我的程序就不会因为SendEmail()方法花费大量时间或失败而被阻止。

这是我的C#代码:(我正在使用.Net 4.5)

private void MyMethod()
{
    DoSomething();
    SendEmail();
}

我可以使用以下方法来实现相同的目标吗?或者还有其他更好的方法吗?使用async /等待更好的方法来实现这一目标吗?

public void MyMethod()
        {
            DoSomething();

            try
            {   
                string emailBody = "TestBody";
                string emailSubject = "TestSubject";

                System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(SendEmailAlert), arrEmailInfo);
            }
            catch (Exception ex)
            {
                //Log error message
            }

        }

        private void SendEmailAlert(object state)
        {
            string[] arrEmailnfo = state as string[];
            MyClassX.SendAlert(arrEmailnfo[0], arrEmailnfo[1]);
        }

如果我需要将SendEmailAlert()方法设为fire并忘记,我可以使用这样的代码这是正确的吗? ---->

Task.Run(()=> SendEmailAlert(arrEmailInfo));

感谢。

1 个答案:

答案 0 :(得分:0)

Async await绝对可以帮到你。当您具有CPU限制工作异步时,可以使用Task.Run()。可以“等待”此方法,以便在任务完成后代码将恢复。

以下是我在你的案子中会做的事情:

public async Task MyMethod()
{
    DoSomething();

    try
    {   
        string emailBody = "TestBody";
        string emailSubject = "TestSubject";

        await Task.Run(()=> SendEmailAlert(arrEmailInfo));

        //Insert code to execute when SendEmailAlert is completed.
        //Be aware that the SynchronizationContext is not the same once you have resumed. You might not be on the main thread here
    }
    catch (Exception ex)
    {
        //Log error message
    }

}

private void SendEmailAlert(string[] arrEmailInfo)
{
    MyClassX.SendAlert(arrEmailnfo[0], arrEmailnfo[1]);
}