我制作了一个加载一堆计算机信息的程序。在 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";
}
--
哇,我只是用信息线程运行它,它仍然需要一些时间来加载(可能是我在主线程中创建的 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();
}