簡體   English   中英

如何在后台工作者DoWork事件中啟用/禁用按鈕?

[英]How can i enable/disable a button in a backgroundworker DoWork event?

我有這種方法:

private void CreateDriversList()
        {
            try
            {
                StreamWriter w = new StreamWriter(contentDirectory + "\\" + "Drivers.txt");
                w.WriteLine("Module Name            Display Name           " + "             " + "                                        Driver Type");
                w.WriteLine("===========            ============ " + "             " + "                                                  ===========");
                System.Management.SelectQuery query = new System.Management.SelectQuery("Win32_SystemDriver");
                System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher(query);
                foreach (System.Management.ManagementObject ManageObject in searcher.Get())
                {
                    w.WriteLine("{0,-22} {1,-75} {2}", ManageObject["Namedfgfdg"], ManageObject["DisplayName"], ManageObject["ServiceType"]);
                    driversListNumbers += 1;
                }
                w.Close();
                Logger.Write("***** Drivers Text File Have Been Created *****");
            }
            catch(Exception err)
            {
                Logger.Write("There was an exception" + Environment.NewLine + err);
                SendEmail.Enabled = true;
            }

        }

從DoWork事件中調用此方法,當我運行程序時,我得到了異常:

跨線程操作無效:控制“ SendEmail”是從不是在其上創建的線程的線程訪問的

System.InvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=Cross-thread operation not valid: Control 'SendEmail' accessed from a thread other than the thread it was created on.
  Source=System.Windows.Forms
  StackTrace:
       at System.Windows.Forms.Control.get_Handle()
       at System.Windows.Forms.Control.OnEnabledChanged(EventArgs e)
       at System.Windows.Forms.ButtonBase.OnEnabledChanged(EventArgs e)
       at System.Windows.Forms.Control.set_Enabled(Boolean value)
       at Diagnostic_Tool_Blue_Screen.Form1.CreateDriversList() in d:\C-Sharp\Diagnostic Tool Blue Screen\Diagnostic Tool Blue Screen\Diagnostic Tool Blue Screen\Form1.cs:line 135
       at Diagnostic_Tool_Blue_Screen.Form1.backgroundWorker1_DoWork(Object sender, DoWorkEventArgs e) in d:\C-Sharp\Diagnostic Tool Blue Screen\Diagnostic Tool Blue Screen\Diagnostic Tool Blue Screen\Form1.cs:line 177
       at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
       at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
  InnerException: 

工作線程永遠不要觸摸UI。 改用BeginInvoke

SendEmail.BeginInvoke((Action)delegate() { SendEmail.Enabled = true; });

您的選擇是

callig和處理WorkerProcess的OnRunWorkerCompleted事件-http: //msdn.microsoft.com/zh-cn/library/System.ComponentModel.BackgroundWorker_methods.aspx

或使用檢查是否需要調用,然后在控件上使用Invoke- http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.invokerequired.aspx

你不可以做這個。 控件駐留在UI線程上,並且您試圖從另一個線程修改控件,這是不可能的。 您必須將結果返回到UI線程,然后從那里對控件執行適當的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM