我正在創建一個簡單的程式來 ping 我們網路上的所有服務器并回傳 ping 請求是否成功。
我正在嘗試利用后臺作業人員,以便用戶可以按下 ping 按鈕并且 ping 在后臺運行,同時他們可以在 UI 上執行其他操作
DoWork 運行良好,沒有回圈讓它無限地保持在那里,它到達了這條線:
r = pinger.Send(s)
然后根據我的理解它結束了,所以應該呼叫 RunWorkCompleted 方法?
經過長時間的缺勤后,我正在重新學習編程,所以如果我錯過了一些明顯的東西,我很抱歉......
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
backgroundWorker1.DoWork = new DoWorkEventHandler(backgroundWorker1_DoWork);
}
private void Ping_Btn_Click(object sender, EventArgs e)
{
count = Convert.ToInt32(pingSeconds_TxtBox.Text);
if (backgroundWorker1.IsBusy != true)
{
// Start operation
backgroundWorker1.RunWorkerAsync();
}
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
if(worker.CancellationPending == true)
{
e.Cancel = true;
}
else
{
for(int i = 0; i <= count; i )
{
MessageBox.Show("something is happening");
// Create ping object
Ping pinger = new Ping();
PingReply r;
// IP to test ping
string s = "###";
try
{
r = pinger.Send(s);
}
catch (Exception b)
{
MessageBox.Show(b.ToString());
}
}
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Show me something");
if(e.Cancelled == true)
{
statusLbl1.Text = "Cancelled";
} else if(e.Error != null)
{
statusLbl1.Text = "Error: " e.Error.Message;
} else
{
statusLbl1.Text = "YEEEEEEEET";
}
}
...
uj5u.com熱心網友回復:
您需要將backgroundWorker1_RunWorkerCompleted
事件處理程式附加到RunWorkerCompleted
事件。C# 編譯器不會根據命名約定將處理程式掛鉤到事件。你必須明確地做到這一點。
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
backgroundWorker1.DoWork = backgroundWorker1_DoWork;
backgroundWorker1.RunWorkerCompleted = backgroundWorker1_RunWorkerCompleted;
}
uj5u.com熱心網友回復:
如果要保持無限回圈,則必須在 backgroundWorker1_DoWork 方法中進行回圈。像這樣的東西
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker) sender;
while (!worker.CancellationPending)
{
//Do your stuff here
for(int i = 0; i <= count; i )
{
MessageBox.Show("something is happening");
// Create ping object
Ping pinger = new Ping();
PingReply r;
// IP to test ping
string s = "###";
try
{
r = pinger.Send(s);
}
catch (Exception b)
{
MessageBox.Show(b.ToString());
}
}
}
}
此外,從后臺執行緒顯示訊息框也不是一個好主意,將其登錄到控制臺或任何檔案中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/496273.html
下一篇:如何按名稱反對并分配父級