大量のコンピューター情報をロードするプログラムを作成しました。Form_Load イベントでは、3 つの情報パネル (その数は増えます) を初期化します。ユニット情報がたくさんあるものは、プログラムのロードがかなり遅くなるようです。私は、WMI からネイティブ呼び出しを使用するように切り替えることで、一連の処理を高速化しようとしましたが、これは非常に役に立ちました。近々、ネットワーク情報も掲載する予定です。以前はそのパネルをロードしていましたが、他のパネルのバグを解決するまで少しの間無効にしました。別のスレッドを使用してバッテリー情報を更新する方法を学びながら、ユニット情報パネルに別のスレッドを作成して、より速くロードできるようにできるかもしれないと考えました。私の情報のいずれかが同時発生の問題を引き起こすかどうかはわかりませんが、私はそれに取り組むことができます.
小さく始めたいのでこれを変えたらどうですか
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();
}
これは正確ですか?
編集 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();
}