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

C# 使矩形在不同的线程中移动?,c#,.net,multithreading,timer,C#,.net,Multithreading,Timer,在没有线程的情况下运行此代码时,将为矩形设置动画。但在这段代码中,矩形并没有设置动画或绘制。请让我知道我应该做的更改考虑一下,就像你的线程不知道UI线程一样,你需要对UI线程调用绘图方法。比如: public partial class Form4 : Form { int x, y = 10; Graphics g; public Form4() { InitializeComponent(); } private voi

在没有线程的情况下运行此代码时,将为矩形设置动画。但在这段代码中,矩形并没有设置动画或绘制。请让我知道我应该做的更改

考虑一下,就像你的线程不知道UI线程一样,你需要对UI线程调用绘图方法。比如:

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));
    }
}

你用错了计时器。将在UI线程上运行

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

您的矩形不会被绘制,因为
勾选
事件从未被触发

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

是一个可能的cadidate。只需将代码更改为:

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

其余部分可以保持原样,您可以看到蓝色矩形在GUI表面上爬行

不知道如何执行多线程不是您的错。但是堆栈溢出不再是学习的地方,除非它是一个简单的问题,具有明确定义的范围,能够给出简单的答案。您需要的是C#中的多线程教程,所以请尝试在youtube上搜索。或者去上大学,为自己的教育买单。@PeterWone“但堆栈溢出不是学习的地方”,我强烈反对。此外,我真的不理解那些反对票。“除非这是一个简单的问题,有一个明确的范围,能够给出一个简单的答案。”看看这篇文章。它拥有你所需要的一切。1) 一个范围明确的简单问题。它有完整的代码来重现问题。只要按要求复制粘贴即可。它本身就是一个@PeterWone和2)“明确定义的范围,能够给出一个简单的答案。”=>答案相当简单。有了360个字符,你就可以为这个问题写下一个看似合理的答案,而不是建议你“上大学,为自己的教育买单。”@PeterWone我唯一能同意你的观点是,这本书显示了研究的严重缺乏。确实如此。但这个问题在这里并不是不恰当,也不是太宽泛。谢谢。成功了。:)
void threadmethod()
{
    System.Timers.Timer t = new System.Timers.Timer();
    t.Enabled = true;
    t.Interval = 100;
    t.Elapsed += T_Tick;
    t.AutoReset = true;
}