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);
}
}