C# 正在完成捕获事件的异步操作

C# 正在完成捕获事件的异步操作,c#,powershell,asynchronous,C#,Powershell,Asynchronous,考虑以下代码(这非常简单,但仅用于测试目的): 类程序 { 静态void Main(字符串[]参数) { 测试t1=新测试(); 对象输出=t1.Run(); 测试t2=新测试(); t2.RunAsync(); t2.EndAsync(); } } 课堂测试 { 运行空间池rsPool; PowerShell p; IAsyncResult异步结果; 对象输出; 公开考试() { rsPool=RunspaceFactory.CreateRunspacePool(1,10); r

考虑以下代码(这非常简单,但仅用于测试目的):

类程序
{
静态void Main(字符串[]参数)
{
测试t1=新测试();
对象输出=t1.Run();
测试t2=新测试();
t2.RunAsync();
t2.EndAsync();
}       
}
课堂测试
{
运行空间池rsPool;
PowerShell p;
IAsyncResult异步结果;
对象输出;
公开考试()
{
rsPool=RunspaceFactory.CreateRunspacePool(1,10);
rsPool.Open();
p=PowerShell.Create();
p、 RunspacePool=rsPool;
p、 AddCommand(“获取服务”);
}
公共对象运行()
{
输出=空;
asyncResult=p.BeginInvoke();
输出=p.EndInvoke(异步结果);
返回输出;
}
public void RunAsync()
{
输出=空;
p、 InvocationStateChanged+=新事件处理程序(p_InvocationStateChanged);
asyncResult=p.BeginInvoke();
}
公共对象EndAsync()
{
//肮脏,但仅用于测试目的
while(输出==null)
系统线程线程睡眠(100);
返回输出;
}
void p_InvocationStateChanged(对象发送方,PSInvocationStateChangedEventArgs e)
{
if(e.InvocationStateInfo.State==PSInvocationState.Completed)
输出=p.EndInvoke(异步结果);
}
}
测试
t1
正确结束,并且
output
包含Get-Service命令的结果

测试
t2
保持在
output=p.EndInvoke(异步结果)上

我完全不明白为什么。
有人能帮忙吗?

尝试将
输出标记为
易失性
注意,这两个操作都不是异步的。实际上,您应该异步执行此操作。
volatile
不会改变任何内容。我知道这些操作不是异步的。这只是一个非常基本的测试,用于尝试理解EndInvoke在接收到完成的事件后为何仍然保持不变。请尝试将
output
标记为
volatile
注意,这两个操作都不是异步的。实际上,您应该异步执行此操作。
volatile
不会改变任何内容。我知道这些操作不是异步的。这只是一个非常基本的测试,试图理解为什么EndInvoke在接收到完成的事件后仍然保持不变。
class Program
{
    static void Main(string[] args)
    {
        Test t1 = new Test();
        object output = t1.Run();

        Test t2 = new Test();
        t2.RunAsync();
        t2.EndAsync();
    }       
}

class Test
{
    RunspacePool rsPool;
    PowerShell p;
    IAsyncResult asyncResult;
    Object output;

    public Test()
    {
        rsPool = RunspaceFactory.CreateRunspacePool(1, 10);
        rsPool.Open();
        p = PowerShell.Create();
        p.RunspacePool = rsPool;
        p.AddCommand("Get-Service");
    }

    public object Run()
    {
        output = null;
        asyncResult = p.BeginInvoke();
        output = p.EndInvoke(asyncResult);
        return output;
    }

    public void RunAsync()
    {
        output = null;
        p.InvocationStateChanged += new EventHandler<PSInvocationStateChangedEventArgs>(p_InvocationStateChanged);
        asyncResult = p.BeginInvoke();
    }

    public object EndAsync()
    {
        // Dirty, but for test purpose only
        while (output == null)
            System.Threading.Thread.Sleep(100);
        return output;
    }

    void p_InvocationStateChanged(object sender, PSInvocationStateChangedEventArgs e)
    {
        if (e.InvocationStateInfo.State == PSInvocationState.Completed)
            output = p.EndInvoke(asyncResult);
    }
}