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;
}
根据docs,Started
不是最终结果。
如何等待结果?
我尝试使用 await
但 ShowComposeNewEmailAsync
返回无效,我无法获得状态。
我正在关注 this link here:它正在使用 async/await
但使用此方法无法获得结果
API 方法的签名是:
public static IAsyncAction ShowComposeNewEmailAsync(EmailMessage message);
如您所见,IAsyncAction
是通用结果,仅通知 await
操作已完成,但不包含任何其他信息 - 在这种情况下不会通知您用户是否实际发送了电子邮件。
如果将它与 Launcher
的 LaunchUriAsync
方法进行比较,例如,您可以看到这种情况:
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;
}
但是,这里的结果并不是用户是否真的发送了邮件。似乎是程序是否正确启动。
我什至在发送或取消电子邮件之前就已经完成了结果。
我有发送电子邮件的功能:
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
返回无效,我无法获得状态。
我正在关注 this link here:它正在使用 async/await
但使用此方法无法获得结果
API 方法的签名是:
public static IAsyncAction ShowComposeNewEmailAsync(EmailMessage message);
如您所见,IAsyncAction
是通用结果,仅通知 await
操作已完成,但不包含任何其他信息 - 在这种情况下不会通知您用户是否实际发送了电子邮件。
如果将它与 Launcher
的 LaunchUriAsync
方法进行比较,例如,您可以看到这种情况:
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;
}
但是,这里的结果并不是用户是否真的发送了邮件。似乎是程序是否正确启动。
我什至在发送或取消电子邮件之前就已经完成了结果。