首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Runspace.OpenAsync()忽略InitialSessionState?

为什么Runspace.OpenAsync()忽略InitialSessionState?
EN

Stack Overflow用户
提问于 2013-07-18 07:53:40
回答 1查看 743关注 0票数 1

我正在编写与PowerShell接口的代码。我最初有以下内容:

代码语言:javascript
复制
using (var runspace = RunspaceFactory.CreateRunspace(initialSessionState))
{
    runspace.Open();

这段代码运行得很好。然而,由于这段代码实际上已经在一个异步方法中,所以我写了以下代码只是为了实验:

代码语言:javascript
复制
public static Task OpenTaskAsync(this Runspace runspace)
{
    if (runspace.RunspaceStateInfo.State == RunspaceState.Opened)
        return Task.FromResult<object>(null);

    var tcs = new TaskCompletionSource<object>();
    EventHandler<RunspaceStateEventArgs> stateHandler = null;
    stateHandler = (o, e) =>
    {
        if (e.RunspaceStateInfo.Reason != null)
        {
            runspace.StateChanged -= stateHandler;
            tcs.TrySetException(e.RunspaceStateInfo.Reason);
        }
        else if (e.RunspaceStateInfo.State == RunspaceState.Opened)
        {
            runspace.StateChanged -= stateHandler;
            tcs.TrySetResult(null);
        }
    };
    runspace.StateChanged += stateHandler;
    runspace.OpenAsync();

    return tcs.Task;
}

但是,在将我的代码更改为以下代码后:

代码语言:javascript
复制
using (var runspace = RunspaceFactory.CreateRunspace(initialSessionState))
{
    await runspace.OpenTaskAsync();

我的测试现在失败了。原因是PowerShell无法再从导入到我的InitialSessionState中的模块中找到命令(在创建运行空间之前)。我不能确定这是为什么。我已经进行了调试,并且在此任务完成后,运行空间已打开并可用,并且在此任务完成之前,我不会继续调用任何命令。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-18 10:10:44

我查看了reflector中的运行空间开放代码,发现了一件可以解释它的事情。在LocalRunspace.DoOpenHelper()中,StateChanged事件(当状态变为“已打开”时)在模块导入之前发生。看起来您可以在设置的默认驱动器上轮询(在InitialSessionState.SetSessionStateDrive()中)作为一种解决办法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17712240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档