2012-04-01 30 views
0

挑战:针对我的简单挑战的线程/独立执行?

我的表格包含14个标签和一个以100ms间隔连续运行的计时器。在计时器内部有代码与文件系统连接并检查某个文件是否存在。根据这个文件的存在,一个简单的真或假,标签的背景颜色从灰色变为红色,如果不再满足条件,则会变回灰色。

一切OK为止。我可以编程,没有问题,它的作品。

现在,也该表格上的,我可能需要点击随时几个按钮。但是,存在一种滞后,使得用户体验看起来像表单被占用。我猜这是由于计时器不得不更新UI,因此无法完全“专注”我的点击请求。我来自一个IT支持背景,并且刚刚掌握OOP和C#.NET,所以对我一无所知:)我正在寻找一个简单的例子,可以帮助我掌握线程/独立执行的基础或任何长远可能是。我很欣赏那里有很多例子,但是你们中的一个可爱的人可以告诉我在我的应用程序中可能需要做什么?

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

     private void Form1_Load(object sender, EventArgs e) 
     { 
      timer1.Start(); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      if (System.IO.File.Exists("C:\file.txt") == true) 
      { 
       label1.BackColor = System.Drawing.Color.Red; 
       //label2.BackColour.. 
       //label3.BackColour.. 
       //..     
      } 
      if (System.IO.File.Exists("C:\file.txt") == false) 
      { 
       label1.BackColor = System.Drawing.Color.Gray; 
       //label2.BackColour.. 
       //label3.BackColour.. 
       //..     
      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      //Do something 
     } 
    } 
} 
+0

到底是什么问题? – svick 2012-04-01 18:28:06

+0

@svick我猜这是更多的设计之一。内森你有没有挑战新技术? – NSGaga 2012-04-01 19:04:59

+0

当然,总是愿意尝试。 – 2012-04-01 19:44:57

回答

2

使用FileSystemWatcher而不是轮询定时器上的文件。由大卫纳尔逊建议

+0

+1 yep,这正是要做的事情 - 当检测到文件时,将按钮置入以找出哪些颜色会改变。无延迟,CPU浪费,GUI冻结轮询。 – 2012-04-01 19:50:43

0

的FileSystemWatcher的是一个更好的选择,这是快速,(非常)肮脏的方式:

public partial class Form1 : Form 
{ 
    private System.Threading.Timer timer1; 

    public Form1() 
    { 
     InitializeComponent(); 

     this.timer1 = new System.Threading.Timer(state => { 
      var fileExists = System.IO.File.Exists(@"C:\file.txt"); 

      this.BeginInvoke(new Action(() => { 
       if (fileExists) { 
        label1.BackColor = System.Drawing.Color.Red; 
        //label2.BackColour.. 
        //label3.BackColour.. 
        //..     
       } 
       else { 
        label1.BackColor = System.Drawing.Color.Gray; 
        //label2.BackColour.. 
        //label3.BackColour.. 
        //..     
       } 
      })); 
     }, null, 0, 100); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

    } 
} 
+0

System.Threading.Timer将调用ThreadPool线程上的委托,这意味着您将访问非UI线程上的控件,这将引发异常。 – 2012-04-02 05:46:58

+0

我试图在VS11中运行这个代码,目标是.NET FW 4的WinForms项目,它工作。我知道它会抛出异常,但事实并非如此。 – 2012-04-02 07:17:00

+0

恰巧可以从后台线程设置BackColor而不失败;然而,这是一个可能随时改变的实现细节。从后台线程设置WinForms控件上的任何属性可能会失败。 – 2012-04-02 22:04:27