我正在开发一个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();
”会在gotServerInfo
和gotConnectionString
设置为true之前先执行
我的猜测是VMM为我的方法启动了多个线程,并且这些线程的执行不再是顺序的。如何让VMM按正确的顺序执行我的方法?
我试图做的事情:
1)为我的方法使用线程,将优先级设置为高,设置当前 线程优先级低或甚至作为背景,但这没有帮助。 Thread.Join也不起作用。
2)将我的方法移到“public override void OnLoad()
或
OnShow()
。无论如何,CreateViewControl()
首先被执行。
有什么想法吗?
答案 0 :(得分:0)
不是解决初始化期间出现的问题的方法,但我转而使用MVVM(WPF)和单独的线程模型。在获得基本界面后,由您决定要做什么以及如何同步所有内容。 VMM后者充当通常的WPF应用程序,为您提供一个接口的主线程。使用ThreadPool类来调度后台任务 - 发现它是最简单的方法。