3 回答

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
您需要聲明并配置BackgroundWorker一次 - 然后在循環(huán)中調(diào)用RunWorkerAsync方法...
public class UpdateController{ private UserController _userController; private BackgroundWorker _backgroundWorker; public UpdateController(LoginController loginController, UserController userController) { _userController = userController; loginController.LoginEvent += Update; _backgroundWorker = new BackgroundWorker(); _backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork); _backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged); _backgroundWorker.WorkerReportsProgress= true; } public void Update() { _backgroundWorker.RunWorkerAsync(); } public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { while (true) { // Do the long-duration work here, and optionally // send the update back to the UI thread... int p = 0;// set your progress if appropriate object param = "something"; // use this to pass any additional parameter back to the UI _backgroundWorker.ReportProgress(p, param); } } // This event handler updates the UI private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { // Update the UI here// _userController.UpdateUsersOnMap(); }}

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
您必須使用Control.InvokeRequired屬性來(lái)確定您是否在后臺(tái)線程上。然后,您需要通過(guò)Control.Invoke方法調(diào)用修改UI的邏輯,以強(qiáng)制UI操作在主線程上發(fā)生。您可以通過(guò)創(chuàng)建委托并將其傳遞給Control.Invoke方法來(lái)完成此操作。這里的問(wèn)題是你需要從Control派生的一些對(duì)象來(lái)調(diào)用這些方法。
編輯:當(dāng)另一個(gè)用戶發(fā)布時(shí),如果您可以等到BackgroundWorker.Completed事件來(lái)更新您的UI,那么您可以訂閱該事件并直接調(diào)用您的UI代碼。在主應(yīng)用程序線程上調(diào)用BackgroundWorker_Completed。我的代碼假設(shè)您希望在操作期間進(jìn)行更新。我的方法的一個(gè)替代方法是訂閱BwackgroundWorker.ProgressChanged事件,但我相信在這種情況下你仍然需要調(diào)用Invoke來(lái)更新你的UI。
例如
public class UpdateController{ private UserController _userController; BackgroundWorker backgroundWorker = new BackgroundWorker(); public UpdateController(LoginController loginController, UserController userController) { _userController = userController; loginController.LoginEvent += Update; } public void Update() { // The while loop was unecessary here backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork); backgroundWorker.RunWorkerAsync(); } public delegate void DoUIWorkHandler(); public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { // You must check here if your are executing on a background thread. // UI operations are only allowed on the main application thread if (someControlOnMyForm.InvokeRequired) { // This is how you force your logic to be called on the main // application thread someControlOnMyForm.Invoke(new DoUIWorkHandler(_userController.UpdateUsersOnMap); } else { _userController.UpdateUsersOnMap() } }}

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊
你應(yīng)該刪除while(true),你正在添加無(wú)限的事件處理程序并無(wú)限次地調(diào)用它們。
- 3 回答
- 0 關(guān)注
- 522 瀏覽
添加回答
舉報(bào)