【问题标题】:How to run my few line of code asynchronously如何异步运行我的几行代码
【发布时间】:2017-02-27 09:05:53
【问题描述】:

我试图异步发送邮件,但我没有使用 asycn 邮件,而是在我调试代码时使用 Parallel.Invoke(() => {}),然后我不是异步的,因为我在 Parallel.Invoke 之后的下一个喜欢是块单元,邮件不是发送。

这是我的示例代码

Parallel.Invoke(() =>
{
    var template = new MailTemplate()
    .WithBody("my sample body")
    .WithSubject("sample sub")
    .WithSender("test1@fakesite.com")
    .WithRecepient("test2@fakesite.com")
    .WithAttachment(filepath)
    .Send();                        
});

oLog.Save("no of job sone " + jbcount, false);

我想承认我的邮件发送程序不是异步的,但我使用Parallel.Invoke 异步调用这些行,但是当我调试时,我看到 oLog.Save 在发送邮件之前没有被调用。

所以告诉我如何异步运行几行代码,结果Parallel.Invoke 之后的代码不应该被阻塞。

【问题讨论】:

  • 使用Task.Run() 而不是Parallel.Invoke()。 (题外话:WithRecepient() 拼写错误...)
  • @MatthewWatson 非常感谢它就像一个魅力。 :)

标签: c# winforms asynchronous task-parallel-library


【解决方案1】:

Parallel.Invoke 将并行运行您传入其中的各种操作,但会阻塞直到所有操作完成。

例如,你可以这样做:

Parallel.Invoke(() => Console.WriteLine("Whaddup"), () => Console.WriteLine("Dawg"));

Console.WriteLine("Fo shizzle");

这将同时执行这两个命令,但是在其他两个命令完成之前它不会写“Fo shizzle”,无论它们完成的顺序如何。

正如@MatthewWatson 上面所说,请改用 Task.Run,​​这将在单独的线程中触发您的操作,并且在完成之前不会阻塞。

Parallel.Invoke 对于异步执行一系列操作(相对于彼此)很有用,但它本身不是异步方法。

【讨论】:

  • 我使用 Task.Run() 完成了我的工作。感谢您的代码。
猜你喜欢
  • 1970-01-01
  • 2011-08-19
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多