AsyncStatus,等待状态完成或取消

时间:2018-01-23 15:33:25

标签: c# winapi asynchronous uwp winrt-async

我有发送电子邮件的功能:

public async Task<bool>  ComposeEmail(string email, string subject)
{
  var emailMessage = new Windows.ApplicationModel.Email.EmailMessage();
  emailMessage.Body = String.Empty;

  var emailRecipient = new Email.EmailRecipient(email);
  emailMessage.To.Add(emailRecipient);
  emailMessage.Subject = subject;

  return EmailManager.ShowComposeNewEmailAsync(emailMessage).status == AsyncStatus.Completed;
}

根据docsStarted不是最终结果 我该如何等待结果?
我尝试使用await,但后来ShowComposeNewEmailAsync返回无效,我无法获得状态。

我正在关注使用async/await的{​​{3}}:但是使用此方法无法获得结果

2 个答案:

答案 0 :(得分:1)

API方法的签名是:

public static IAsyncAction ShowComposeNewEmailAsync(EmailMessage message);

如您所见,IAsyncAction是通用结果,仅通知await操作已完成,但未携带任何其他信息 - 在这种情况下,如果用户不通知您实际上是否发送过电子邮件。

如果您将其与Launcher的{​​{1}}方法进行比较,则可以看到这种情况:

LaunchUriAsync

这个返回一个public static IAsyncOperation<bool> LaunchUriAsync(Uri uri); ,表示启动是否成功。

这意味着内置API不支持您需要的功能,它只会创建邮件并准备供用户发送,但您无法知道她是否实际发送过邮件。

作为替代方案,您可以向用户显示确认对话框,如果他已发送电子邮件,或者是否应再次显示邮件撰写窗口。

var messageDialog = new MessageDialog(“找不到互联网连接。”);

bool

作为证明,您可以使用以下代码段:

var messageDialog = new MessageDialog( "Have you successfully sent the e-mail?" );    
messageDialog.Commands.Add(new UICommand(
    "Yes", 
    new UICommandInvokedHandler(YesHandler)));
messageDialog.Commands.Add(new UICommand(
    "Try again", 
    new UICommandInvokedHandler(TryAgainHandler)));  
await messageDialog.ShowAsync();

邮件应用启动后,var action = EmailManager.ShowComposeNewEmailAsync(emailMessage); await action; Debug.WriteLine(action.Status); 始终为Status

但确实很不幸的是,行动的Completed结果不可用。我认为原因是任何应用都可以响应请求,包括较旧的Win32应用。

答案 1 :(得分:0)

这是我最终做的事情。

public async Task<bool>  ComposeEmail(string email, string subject)
{
    var emailMessage = new Windows.ApplicationModel.Email.EmailMessage();
    emailMessage.Body = String.Empty;

    var emailRecipient = new  Email.EmailRecipient(email);
    emailMessage.To.Add(emailRecipient);
    emailMessage.Subject = subject;

    var x = (EmailManager.ShowComposeNewEmailAsync(emailMessage));

    await x; 
    return x.Status == AsyncStatus.Completed;
}

但是,此处的结果不是用户是否实际发送了电子邮件。似乎该程序是否正确运行。

即使在发送或取消电子邮件之前,我的结果也已完成。