使矩形在不同的线程中移动?

时间:2018-02-19 11:44:50

标签: c# .net multithreading timer

public partial class Form4 : Form
{

    int x, y = 10;

    Graphics g;

    public Form4()
    {
        InitializeComponent();
    }

    private void Form4_Load(object sender, EventArgs e)
    {
        g = this.CreateGraphics();

        System.Threading.Thread th = new System.Threading.Thread(threadmethod);

        th.Start();            
    }

    void threadmethod()
    {
        Timer t = new Timer();
        t.Enabled = true;
        t.Interval = 100;
        t.Tick += T_Tick;
    }

    private void T_Tick(object sender, EventArgs e)
    {
        g.DrawRectangle(new Pen(Brushes.Blue), new Rectangle(x++, y++, 20, 20));
    }
}

在没有线程运行此代码时动画一个矩形。但矩形不是动画或在此代码中绘制的。请让我知道我应该做出的改变

2 个答案:

答案 0 :(得分:0)

想想它就像你的线程不知道UI线程一样,你需要调用你的绘图方法到UI线程。类似的东西:

App.Current.Dispatcher.Invoke(() => { g.DrawRectangle(new Pen(Brushes.Blue), 
new Rectangle(x++, y++, 20, 20)); });

答案 1 :(得分:0)

您使用的是错误的计时器。使System.Windows.Forms.Timer在UI线程上运行。

  

此Windows计时器专为使用UI线程执行处理的单线程环境而设计。

未绘制矩形,因为永远不会触发Tick事件!

解决方案:改为使用在后台运行的计时器:

System.Timers.Timer是一个可能的傻瓜。将我们的代码简单地改为:

void threadmethod()
{
    System.Timers.Timer t = new System.Timers.Timer();
    t.Enabled = true;
    t.Interval = 100;
    t.Elapsed += T_Tick;
    t.AutoReset = true;
}

其余部分可保持不变,您可以看到蓝色矩形在GUI表面上蔓延