如何等待ShowComposeNewEmailAsync完成/取消并获取AsyncStatus状态?
如何获取Windows EmailManager.ShowComposeNewEmailAsync的最终操作状态?
我明白你的困扰——ShowComposeNewEmailAsync看起来像是返回void,没法直接await获取最终状态,但其实这里有个小误区:这个API实际返回的是IAsyncAction(Windows Runtime的异步操作类型),而不是void。我们可以通过.NET的扩展方法把它转换成可await的Task,从而捕获操作的最终状态。
先修正你代码里的语法错误(参数不能用带引号的写法),然后用下面的方式实现:
using System; using System.Threading.Tasks; using Windows.ApplicationModel.Email; public async Task<bool> ComposeEmail(string email, string subject) { var emailMessage = new EmailMessage(); emailMessage.Body = string.Empty; var emailRecipient = new EmailRecipient(email); emailMessage.To.Add(emailRecipient); emailMessage.Subject = subject; try { // 将WinRT的IAsyncAction转换为.NET Task,等待操作完成 await EmailManager.ShowComposeNewEmailAsync(emailMessage).AsTask(); // 走到这里说明邮件撰写操作已完成(用户发送或保存了邮件) return true; } catch (OperationCanceledException) { // 用户直接关闭了撰写窗口,取消了操作 return false; } catch (Exception) { // 处理其他异常,比如系统没有可用的邮件客户端等情况 return false; } }
关键说明:
AsTask()是System.Threading.Tasks命名空间下的扩展方法,它能把WinRT的异步操作类型(IAsyncAction/IAsyncOperation)转换成.NET标准的Task,这样就能用async/await语法等待操作结束。- 当用户完成邮件操作(发送/保存),Task会正常完成;如果用户直接关闭撰写窗口取消操作,会抛出
OperationCanceledException,我们可以通过捕获这个异常来判断取消状态。 - 这种方式不需要直接处理
AsyncStatus枚举,而是用.NET异步编程模型的标准方式来获取最终结果,比手动跟踪AsyncStatus更简洁可靠。
内容的提问来源于stack exchange,提问作者Moha the almighty camel
相关产品推荐
相关产品推荐

