如何在C#的同时运行这两种方法?

时间:2014-08-27 05:19:02

标签: c#

我试图让这两个图片框的大小增加,然后使用两种不同的方法/ while循环同时减小尺寸。我怎样才能做到这一点?它的工作原理是,当点击按钮时,两个图片框的大小会增加,直到达到给定的大小,然后它们的大小都会减小。

    private void bthGraph_Click(object sender, EventArgs e)
    {
        red();
        blue();
    }

    private void btnReset_Click(object sender, EventArgs e)
    {
        pbxBlue.Width = 10;
        pbxRed.Width = 10;
    }

    public void red()
    {
        int width = 10;
        while (width < 156)
        {
            width++;
            pbxRed.Width = width;
            pbxRed.Refresh();
            Thread.Sleep(10);
        }
        while (width > 10)
        {
            width--;
            pbxRed.Width = width;
            pbxRed.Refresh();
            Thread.Sleep(10);
        }
    }

    private void blue()
    {
        while (pbxBlue.Width < 156)
        {
            pbxBlue.Width++;
            pbxBlue.Refresh();
            Thread.Sleep(10);
        }
        while (pbxBlue.Width > 10)
        {
            pbxBlue.Width--;
            pbxBlue.Refresh();
            Thread.Sleep(10);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

试试这种方式

private void bthGraph_Click(object sender, EventArgs e)
{
    Task[] tasks = new Task[]
    {
       new Task(red),
       new Task(blue),
    };

    foreach(var task in tasks)
       task.Start();

    new Task(red).Start();
    new Task(blue).Start();
}

答案 1 :(得分:0)

每个控件只能由创建它的线程更新,表示您无法同时从两个线程*访问UI,因此您无法以这种方式实现您尝试执行的操作。如果您不想制作动画,为什么还需要两种方法?

你应该(正如评论中已经提到的那样)摆脱&#34; Thread.Sleep&#34;在UI线程中,最好使用Timer。

*通过将Property CheckForIllegalCrossThreadCalls设置为false,有一种非常脏的方法。但绝不应该这样做,因为它会导致意外和无法追踪的错误。

相关问题