多线程表单和用户控件

时间:2017-01-11 12:05:26

标签: c# multithreading

我的visual studio项目设置如下: 在表单面板上,我添加用户控件(UC)代码:

表格

panel.Controls.Add(UC.Instance);
UC.Instance.Location = new Point(-(panel.Size.Width), 0);
UC.Instance.BringToFront();
roll_in();
用户控件

中的

private static UC _instance;
public static UC Instance
{
    get
    {
        if (_instance == null)
            _instance = new UC();
        return _instance;
    }
}

当我按表单上的按钮时,用户控件会添加到表单面板中,并使用以下代码滑动用户控制到其位置:

private void roll_in()
{
    while (UC.Instance.Location.X < panel.Location.X)
    {
        UC.Instance.Location = new Point((UC.Instance.Location.X + 2));
        UC.Instance.Refresh();
        if (UC.Instance.Location.X > -10)
            System.Threading.Thread.Sleep(10);
    }
}

当我使用roll_in()时,所有其他函数和表单都在等待此过程完成。

有没有办法可以在另一个帖子上滑动User control? 我尝试通过创建另一个线程来调用roll_in(),但它说控件是在另一个线程上创建的。

有人可以帮助我指导我走正确的道路吗? 我怎样才能做动画&#34;不影响其他控件?

谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

在我看来,你通过调用thread.sleep来阻止UI线程。你通常不想出于任何原因这样做。创建了异步任务来处理这样的UI问题。试试这段代码。

<br>

这可以防止在睡眠周期中阻塞。

答案 1 :(得分:0)

您还可以在循环中使用Application.DoEvents()定期处理winforms事件队列:

private void roll_in()
{
    while (UC.Instance.Location.X < panel.Location.X)
    {
        UC.Instance.Location = new Point((UC.Instance.Location.X + 2));
        UC.Instance.Refresh();
        Application.DoEvents();
}

}

Application.DoEvents()上的信息:https://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents(v=vs.110).aspx