我有发送电子邮件的功能:
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;
}
根据docs,Started
不是最终结果
我该如何等待结果?
我尝试使用await
,但后来ShowComposeNewEmailAsync
返回无效,我无法获得状态。
我正在关注使用async/await
的{{3}}:但是使用此方法无法获得结果
答案 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;
}
但是,此处的结果不是用户是否实际发送了电子邮件。似乎该程序是否正确运行。
即使在发送或取消电子邮件之前,我的结果也已完成。