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

Powershell与TaskScheduler调用C#异步任务异常问题排查

问题根源

你代码里的核心问题是异步任务未被正确等待:

  • SetupTasks中用new Task(() => QueueEndpointCall())创建的外层Task,执行的是未被await的异步方法调用。当QueueEndpointCall执行到第一个await GetAsync时会立即返回,外层Task随即标记为完成状态。
  • 主线程的Task.WaitAll等待的是这个外层Task,而非QueueEndpointCall内部真正的异步操作。当外层Task完成后主线程结束,此时QueueEndpointCall后续的...other code还没来得及执行,进程就被终止(尤其是TaskScheduler触发的场景,进程生命周期管控更严格)。
  • 这种“火即忘”的异步调用还会导致内部异常无法被正确捕获:即使QueueEndpointCall里有try/catch,未被等待的Task异常会触发UnobservedTaskException,不会写入你的自定义日志。
修复方案

1. 直接使用异步任务本身,移除冗余外层Task

修改SetupTasks,直接将QueueEndpointCall返回的Task加入列表,不需要额外包裹:

private void SetupTasks() {
    // 异步方法调用后直接返回Task,加入列表即可
    var task = QueueEndpointCall();
    g_list_Tasks.Add(task);
}

2. 删除Task.Start()调用

异步方法返回的Task是热任务(调用后立即开始执行),不需要手动调用Start()。修改EntryPoint:

public void EntryPoint() {
    SetupTasks();
    // 直接等待所有异步任务完成
    Task.WaitAll(g_list_Tasks.ToArray());
}

3. (可选)将入口改为异步方法(符合异步编程规范)

如果允许修改入口方法签名,推荐改为异步版本,避免阻塞主线程:

public async Task EntryPointAsync() {
    SetupTasks();
    await Task.WhenAll(g_list_Tasks);
}

调用的PowerShell脚本需同步等待该方法完成,比如使用Wait-Job或同步调用逻辑。

4. 完善异常日志排查

在QueueEndpointCall的catch块中,确保日志能写入有权限的路径(避免TaskScheduler环境下的权限问题):

private async Task QueueEndpointCall() {
    try {
        HttpResponseMessage _httprm = await g_httpclient_Main.GetAsync("http://www.google.com");
        var _string_HTTP = await _httprm.Content.ReadAsStringAsync();
        // ...other code
    }
    catch (Exception e) {
        // 使用用户目录等可写入路径
        string logPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "library_error.log");
        File.AppendAllText(logPath, $"[{DateTime.Now}] Error: {e.Message}\n{e.StackTrace}\n");
    }
}

5. 检查TaskScheduler配置

  • 确保TaskScheduler中配置的执行用户有网络访问权限(能连接到目标地址)
  • 确认“是否允许在用户未登录时运行”的配置,避免网络环境受限

内容的提问来源于stack exchange,提问作者maegus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:40:01