小编Fli*_*tZA的帖子

应该如何处理等待异步任务并在同一方法中显示模态形式?

我有一个Windows窗体应用程序,我在其中使用SmtpClient发送电子邮件.应用程序中的其他异步操作使用async/await,理想情况下,我希望在发送邮件时保持一致.

我在发送邮件时显示一个带取消按钮的模态对话框,并将SendMailAsync与form.ShowDialog组合在一起,因为等待发送会阻塞,所以ShowDialog也是如此.我目前的做法如下,但看起来很乱,有没有更好的方法呢?

private async Task SendTestEmail()
{
  // Prepare message, client, and form with cancel button
  using (Message message = ...)
  {
     SmtpClient client = ...
     CancelSendForm form = ...

     // Have the form button cancel async sends and
     // the client completion close the form
     form.CancelBtn.Click += (s, a) =>
     {
        client.SendAsyncCancel();
     };
     client.SendCompleted += (o, e) =>
     {
       form.Close();
     };

     // Try to send the mail
     try
     {
        Task task = client.SendMailAsync(message);
        form.ShowDialog();
        await task; // Probably redundant …
Run Code Online (Sandbox Code Playgroud)

c# winforms async-await

8
推荐指数
1
解决办法
3832
查看次数

更好的方法来确定std :: istream的长度?

有没有比下面更好的方法来确定std :: istream的长度:

std::istream* pcStream = GetSomeStream();
pcStream->seekg(0, ios::end);
unsigned int uiLength = pcStream->tellg();
Run Code Online (Sandbox Code Playgroud)

只是寻求到流的末尾然后寻找原始位置似乎真的很浪费,特别是如果流可能是某些慢速媒体(如CD或DVD)上的文件.

c++ std stream

7
推荐指数
1
解决办法
1万
查看次数

标签 统计

async-await ×1

c# ×1

c++ ×1

std ×1

stream ×1

winforms ×1