gpt4 book ai didi

c# - 从 powershell ISE 调用时无法以异步 C# 代码写入控制台

转载 作者:行者123 更新时间:2023-11-30 20:20:07 26 4
gpt4 key购买 nike

我有一个 PowerShell 脚本需要调用 C# 来完成工作,其中一些是异步的。在调试仅当从 PowerShell 调用 C# 代码时才会发生的一些错误时,我注意到了一些我没有预料到的事情。在 C# 代码中,如果我调用 Console.WriteLine,它会按预期写入 PowerShell 控制台除非我使用的是 PowerShell ISE,它是在我执行在异步函数中等待。

这是一个显示问题的示例脚本:

$source = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

public class TestClass
{
public static int TestWrapper()
{
var task = TestAsync();
task.Wait();
return task.Result;
}

private static async Task<int> TestAsync()
{
Console.WriteLine("Before await");
await Task.Run(() => { Thread.Sleep(2000); return; });
Console.WriteLine("After await");
return 2;
}
}

"@

Add-Type -TypeDefinition $source
[TestClass]::TestWrapper()

在这里,我只是调用一个异步函数,等待它完成,然后返回结果。在函数内部,我只是尝试在返回值之前让线程休眠几秒钟之前和之后进行记录,以便我知道该函数已完全执行。

我希望看到:

Before await
After await
2

这就是我在作为 C# 控制台应用程序或在基本 PowerShell 中运行时所看到的,但在通过 PowerShell ISE 运行时,我看到:

Before await
2

谁能解释一下为什么会这样?

最佳答案

PowerShell ISE 使用 Console.SetOutHostTextWriter在 PowerShell ISE 主机窗口上捕获并打印 Console.WriteLine 输出。只有当主机为当前线程注册 ( HostTextWriter.RegisterHost) 时,HostTextWriter 才会将 Console.WriteLine 重定向到 PowerShell 主机。

在没有 SynchronizationContext 的情况下,由 await 关键字引起的继续将在任意线程池线程中执行,这可能没有任何已注册的 PowerShell 主机来重定向 Console .WriteLine 到.

关于c# - 从 powershell ISE 调用时无法以异步 C# 代码写入控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37446718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com