2016-12-17 80 views
1

我想在後臺加載新表單並在加載後顯示它。 但我總是得到這個錯誤:「無效的跨線程訪問」與代碼: 如何使它工作?!在後臺工作人員和showdialog加載新表格在完成的方法

public partial class f1 : Form 
{ 
    private Form f2; 
    public f1() 
    { 
     InitializeComponent(); 
     BackgroundWorker bgw = new BackgroundWorker(); 
     bgw.RunWorkerAsync(); 
     bgw.DoWork += new DoWorkEventHandler(dowork); 
     bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(completed); 
    } 
    void dowork(object sender, DoWorkEventArgs e) 
    { 
     f2 = new f2(); 
    } 

    void completed(object sender, RunWorkerCompletedEventArgs e) 
    { 
     f2.showdialog(); 
     this.Close(); 
    } 

} 
+2

它永遠不會工作。您不能在後臺線程上執行任何UI工作。無論如何,在這種特定情況下你會獲得什麼?如果你在構造函數中長時間運行的工作將代碼移走,也許你可以卸載(部分)方法到後臺線程。 –

+0

可能重複[無效的跨線程訪問backgroundworker錯誤c#](http://stackoverflow.com/questions/28597958/invalid-cross-thread-access-backgroundworker-error-c-sharp) –

+1

錯誤的方法。你應該立即顯示'f2'(順便說一句,這是一個非常糟糕的類名**,因爲它沒有意義,甚至不遵循標準的命名約定)。一旦顯示錶格,你就可以從新表格開始後臺處理。如果您不想立即顯示新表單,那麼您應該向用戶提供一些反饋,以便他知道發生了什麼情況。 – Phil1970

回答

0

您可能不得不將單獨的數據載入窗體並將UI初始化形成兩個不同的faze。

我已將您的代碼示例更改爲以下內容。

public partial class Form2 : Form 
     { 
      public Form2() 
      { 
       InitializeComponent(); 

       BackgroundWorker bgw = new BackgroundWorker(); 
       bgw.RunWorkerAsync(); 
       bgw.DoWork += new DoWorkEventHandler(dowork); 
       bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(completed); 
      } 
      void dowork(object sender, DoWorkEventArgs e) 
      {  
       e.Result = InitializeNeededDataToShowOnTheSecondform(); 
      } 


      void completed(object sender, RunWorkerCompletedEventArgs e) 
      { 
       BeginInvoke(new MethodInvoker(() => 
       { 
        var f2 = new Form3(e.Result); 
        f2.ShowDialog(); 
        this.Close(); 

       })); 
      } 

      private object InitializeNeededDataToShowOnTheSeconDform() 
      { 
//time consuming data initialization and/or any other time consuming process 
       return 10; 
      } 

     }