SCVMM 2012控制台插件执行

时间:2014-02-27 13:03:38

标签: c# wpf multithreading powershell add-in

我正在开发一个SCVMM 2012控制台加载项。

可以在此处找到SDK文档:http://msdn.microsoft.com/en-us/library/jj860311.aspx

但是文档中没有关于线程的信息或者加载项的执行方式。

现在这就是我所拥有的:

public class SomeAddIn : ViewAddInBase
{ 
private bool gotServerInfo = false;
private bool gotConnectionString = false;
public override FrameworkElement CreateViewControl()
    {
    GetServerInfo();
    GetConnectionString();
    if(gotServerInfo && gotConnectionString)
    {
     return GetGoodFrameworkElement(); //do some stuff to fill FrameworkElement
    }
    MessageBox.Show("Can't connect to DB, returning empty screen...");
    return new FrameworkElement();
    }

    private void GetServerInfo()
    {
    PowerShellContext.ExecuteScript<ServerConnection>("Get-SCVMMServer localhost",
    (items, error) =>
        {
            // code to set server info here
            if (error == null)
            {
                gotServerInfo = true;
                MessageBox.Show("Got settings from server.");
            }
            else{//Error}
        });
    }
    private void GetConnectionString()
    {
    //PowerShell connect to database, get connection string
    gotConnectionString = true; //if got string
    }
}

看起来很不错,但问题是powershell命令需要一段时间才能执行,“return new FrameworkElement();”会在gotServerInfogotConnectionString设置为true之前先执行

我的猜测是VMM为我的方法启动了多个线程,并且这些线程的执行不再是顺序的。如何让VMM按正确的顺序执行我的方法?

我试图做的事情:

1)为我的方法使用线程,将优先级设置为高,设置当前     线程优先级低或甚至作为背景,但这没有帮助。     Thread.Join也不起作用。

2)将我的方法移到“public override void OnLoad()或     OnShow()。无论如何,CreateViewControl()首先被执行。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

不是解决初始化期间出现的问题的方法,但我转而使用MVVM(WPF)和单独的线程模型。在获得基本界面后,由您决定要做什么以及如何同步所有内容。 VMM后者充当通常的WPF应用程序,为您提供一个接口的主线程。使用ThreadPool类来调度后台任务 - 发现它是最简单的方法。