2013-04-26 76 views
0

我有一个程序使用多个background workers,它连续地load and read text files (size can up to 1MB)并更新到oracle数据库。在c#中使用backgroundworker时主线程没有响应

我遇到的问题是无论何时后台工作人员正在读取文件,main thread将变为not responding它不应该是。这是读取文件时的默认行为,有什么方法可以解决吗?

谢谢,任何帮助将非常感激。

更新:我的程序代码,简短视图]

private void program_Load(object sender, EventArgs e) 
    { 
     bw1.RunWorkerAsync(); 
     bw2.RunWorkerAsync(); //same function as bw1 but different directory 
    } 

    private void bw1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     while (true) 
     { 
      Thread.Sleep(5000); 
      bw1.ReportProgress(0); 
     } 
    } 

    private void bw1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     directoryInfo = /* directory url */; 
     files = directoryInfo .GetFiles(); 

     foreach (FileInfo file in files) 
     { 
      /* 
       read file line by line 
       load data into database 
       update file loading status to UI 
      */ 
     } 
    } 
+0

你的主线是什么?你的意思是在屏幕上显示的UI线程? – 2013-04-26 02:33:40

+1

向我们展示一个完整但简洁的示例代码,演示此问题。 – 2013-04-26 02:36:55

+0

@ToanVo是的,主线程是指我的用户界面 – noobie 2013-04-26 02:38:44

回答

2

所有实际的“工作”在bw1_ProgressChanged事件处理程序执行。此代码正在UI /主线程上执行。

BackgroundWorker.ProgressChanged的用途是允许UI更新进度条或其他小部件。实际工作(在这种情况下,加载文件)应在bw1_DoWork方法中执行。

+0

+1,我会补充一点,当你在断点处使用Visual Studio中的线程窗口来查看你是否在主线程中时,这很有用。 – 2013-04-26 04:28:46

+0

感谢您的解答,问题解决了。真的很感激〜 – noobie 2013-04-26 05:48:06