You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何等待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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:03:12