我做了一個加載一堆計算機信息的程序。在Form_Load事件中,我將它初始化爲3(該數字將增長)信息面板。有一堆單元信息似乎會使程序加載得相當緩慢。我試圖通過從WMI切換到使用Native調用來加速它,這幫助了一大堆。不久,我也會發佈網絡信息。我曾經加載該面板,但我禁用它一點點,直到我找出我的其他面板中的錯誤。因此,在瞭解如何使用單獨的線程更新電池信息時,我認爲我可以在單元信息面板中創建單獨的線程,以便加載速度更快。我不知道我的任何信息會導致併發問題,但我可以在這方面努力。多線程加速加載時間
我想開始小,所以如果我改變一下這個
private void Form1_Load(object sender, EventArgs e)
{
unitInformationPanel1.PopulateUnitInformation();
batteryInformationPanel1.InitializeBatteries();
magStripeReaderPanel1.SetupPointOfSale();
}
這個
private void Form1_Load(object sender, EventArgs e)
{
Thread infoThread = new Thread(new ThreadStart(unitInformationPanel1.PopulateUnitInformation));
infoThread.Start();
batteryInformationPanel1.InitializeBatteries();
magStripeReaderPanel1.SetupPointOfSale();
}
會時填入單元信息完成的信息線程被終止?或者將該線程創建移動到PopulateUnitInformation更好?這是它的樣子。
public void PopulateUnitInformation()
{
unitModelLabel.Text = Properties.Settings.Default.UnitModelString;
serialNumberLabel.Text = Properties.Settings.Default.UnitSerialString;
biosVersionLabel.Text = UnitBios.GetBiosNumber();
osLabel.Text = OS.getOSString();
cpuLabel.Text = UnitCpu.GetCpuInfo();
var hdd = HddInfo.GetHddInfo();
diskNameLabel.Text = hdd.Name;
diskCapacityLabel.Text = hdd.Capacity;
diskFirmwareLabel.Text = hdd.Firmware;
memoryLabel.Text = MemoryInformation.GetTotalMemory();
NetworkPresenceInformation.GetAdapatersPresent();
biometricLabel.Text = BiometricInformation.IsPresent ? "Present" : "Not Present";
var networkAdaptersPresense = NetworkPresenceInformation.GetAdapatersPresent();
bluetoothLabel.Text = networkAdaptersPresense[0] ? "Present" : "Not Present";
wifiLabel.Text = networkAdaptersPresense[1] ? "Present" : "Not Present";
cellularLabel.Text = networkAdaptersPresense[2] ? "Present" : "Not Present";
}
-
哇,我剛剛與infothread運行它,它仍然花了一些時間來加載(可能是12個板我在主線程創建的,但它裝載的12幀和單位信息面板填充一切後,其信息加載,這是很酷,但它安全嗎?是不是有點容易使12個線程對我的面板?或者是啞巴?
編輯
這個我這是我爲秒錶做的。
Stopwatch programTimer;
public Form1()
{
programTimer = Stopwatch.StartNew();
InitializeComponent();
SetupDebugWindow();
TerminateKeymon();
UnitModel.SetModel();
UnitSerialNumber.SetSerialNumber();
}
private void Form1_Shown(object sender, EventArgs e)
{
audioBrightnessPanel1.UpdateBrightnessTrackbar();
applicationLauncherPanel1.LoadApplications();
programTimer.Stop();
Console.WriteLine("Load Time: {0}",programTimer.ElapsedMilliseconds);
timer1.Start();
}
這將是準確的?
EDIT 2 2012年6月18日
嗯,我花了使用的BackgroundWorker的意見。請讓我知道,如果我這樣做的權利。
private void Form1_Load(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
void BackgroundWorker1DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
unitInformationPanel1.PopulateUnitInformation();
batteryInformationPanel1.InitializeBatteries();
magStripeReaderPanel1.SetupPointOfSale();
}
也有一種方法來計時嗎? –
你正在說電池。這是用於移動設備(Win Phone,Android等)還是PC /筆記本電腦?個人電腦有一個[BackgroundWorker](http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx),這將是偉大的。 – jp2code
@ jp2code PC平板電腦。 –