AsyncStatus,等待 Status 完成或取消

AsyncStatus, wait for Status completed or canceled

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

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不是最终结果。
如何等待结果?
我尝试使用 awaitShowComposeNewEmailAsync 返回无效,我无法获得状态。

我正在关注 this link here:它正在使用 async/await 但使用此方法无法获得结果

API 方法的签名是:

public static IAsyncAction ShowComposeNewEmailAsync(EmailMessage message);

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

如果将它与 LauncherLaunchUriAsync 方法进行比较,例如,您可以看到这种情况:

public static IAsyncOperation<bool> LaunchUriAsync(Uri uri);

这个 returns 一个 bool 指示启动是否成功。

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

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

var messageDialog = new MessageDialog("No internet connection has been found.");

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

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

这是我最终做的事情。

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;
}

但是,这里的结果并不是用户是否真的发送了邮件。似乎是程序是否正确启动。

我什至在发送或取消电子邮件之前就已经完成了结果。