2013-12-19 33 views
0

我工作的一个WindowsForm并试图从文件导入数据,同时,我想只要我在读它显示在筛网新的数据。刷新控件在运行时

我的基本代码看起来是这样的:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     Read_in(); 
    } 

    List<Data> _list = new List<Data>(); 

    public void Read_in() 
    { 
     using (StreamReader sr = new StreamReader("in.txt")) 
     { 
      while (!sr.EndOfStream) 
      { 
       Data d = new Data 
       { 
        a = sr.ReadLine() 
       }; 
       _list.Add(d); 
       Controls.Add(d.pb); 
      } 
     } 
    } 
} 

class Data 
{ 
    public string a; 
    public PictureBox pb = new PictureBox() 
    { 
     BackColor = Color.Red 
    }; 
} 

的问题是,当Read_in()完成我的数据仅显示。我该如何帮助?

下面是类似这样的帖子,但我无法理解: Why won't control update/refresh mid-process

回答

1

那是因为数据是在UI线程读取。你将不得不产生一个新的线程并加载数据,从而释放UI线程以进行更新。

由于阿列克谢建议这里是解释一下:

enter image description here

注意,UI线程在多线程处理,只要是在通常的过程中被执行的UI更新受阻,反之,后台工作呢所有你需要照顾的更新是Syncing。

请修改代码如下,让我知道:

public void Read_in() 
{ 
    BackgroundWorker backgroundWorker1 = new BackgroundWorker(); 
    backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); 
    backgroundWorker1.RunWorkerAsync(); 

} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    using (StreamReader sr = new StreamReader("in.txt")) 
    { 
     while (!sr.EndOfStream) 
     { 
      Data d = new Data 
      { 
       a = sr.ReadLine() 
      }; 
      if(this.InvokeRequired) 
      { 
       this.Invoke((MethodInvoker)delegate 
       { 
        _list.Add(d); 
        Controls.Add(d.pb); 
       }); 

      } 
      else 
      { 
       _list.Add(d); 
       Controls.Add(d.pb); 

      } 
     } 
    } 
} 
+1

+0:请注意,您的帖子正是OP所评论的“我无法理解”......我不确定您的文章如何解释冻结UI概念比链接帖子更好。 –

+0

你是对的@AlexeiLevenkov! – Abhinav

+0

谢谢,它的工作原理。你帮我理解了一件新事物! :) – BenG

1

线程是像在超市线。现在认为你只有一个结账。与您的文件的家伙在结帐。而那些用于控制画的家伙就在线后面。画家不能在结帐时付款,所以他无法绘制控件。所以他被结帐时因为档案人而被封锁。

您的gui线程是结账的行。画家可以通过结帐的方式是打开另一个结帐。所以他可以付款并通过结帐。之后,他可以绘制控件。所以打开另一个现金就是开一个新的线程。在新线程上,您可以执行文件读取。因为这位画家在结账时没有被挡在档案人员身上。

或者您在结帐时设置了两个女人: http://msdn.microsoft.com/de-de/library/system.io.streamreader.readlineasync(v=vs.110).aspx 这样结帐不会挡住文件夹。