非UI线程创建窗体

sj490790083 2017-08-03 06:22:53
希望达到的效果是,创建线程并且在该线程上创建窗体,窗体内部有计时器System.Timers.Timer,在加载时定时做一些操作,
当主UI线程被一些操作阻塞时,不要影响创建的窗体的计时器动作,有啥办法吗?目前尝试过在新建窗体上用委托的BeginInvoke和System.Timers.Timer去做一些操作,但是都会被UI线程阻塞。

//创建窗体
Thread t = new Thread(new ThreadStart(() =>
{
Form2 frm2 = new Form2();
this.BeginInvoke(new Action(()=>{frm2.Show();}));
}));
t.Start();

//测试窗体
public partial class Form2 : Form
{
System.Timers.Timer timer = new System.Timers.Timer();
delegate void DelSetOpacity();
public Form2()
{
InitializeComponent();
timer.Interval = 20;
timer.Elapsed += timer_Elapsed;
}

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
this.BeginInvoke(new Action(() =>
{
if (this.Opacity < 0.99)
this.Opacity += 0.01;
}));

}

private void Form2_Load(object sender, EventArgs e)
{
DelSetOpacity del1 = new DelSetOpacity(SetOpacity);
del1.BeginInvoke(new AsyncCallback(CallBack), null);
//timer.Start();
}

private void CallBack(IAsyncResult ar)
{

}

private void SetOpacity()
{
while (true)
{
Thread.Sleep(20);
this.BeginInvoke(new Action(() =>
{
if (this.Opacity < 0.99)
this.Opacity += 0.01;
}));
}
}
}
...全文
254 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sj490790083 2017-08-04
  • 打赏
  • 举报
回复
引用 5 楼 Libby1984 的回复:
[quote=引用 1 楼 Libby1984 的回复:] 你这样做完全没有意义。你是想在另一个线程中创建窗口。但是用BeginInvoke,其实就是委托主线程显示窗口,最终还是在主线程中做的显示操作,所以还不如直接在主线程中完成。而且你在线程中Form2 frm2 = new Form2();应该是不成功的。
你首先要确定是哪些操作阻塞了你的界面。如果非界面操作阻塞,那么你可以将这些操作放到一个新的线程中做,如果是界面操作,那就如楼上所说,无解。只能改变你自己的程序设计思路。[/quote]ok。我也知道正确的解决思路应该是去处理为什么会阻塞,哎,那边的代码出于各种原因改不了,谢了。
  • 打赏
  • 举报
回复
引用 1 楼 Libby1984 的回复:
你这样做完全没有意义。你是想在另一个线程中创建窗口。但是用BeginInvoke,其实就是委托主线程显示窗口,最终还是在主线程中做的显示操作,所以还不如直接在主线程中完成。而且你在线程中Form2 frm2 = new Form2();应该是不成功的。
你首先要确定是哪些操作阻塞了你的界面。如果非界面操作阻塞,那么你可以将这些操作放到一个新的线程中做,如果是界面操作,那就如楼上所说,无解。只能改变你自己的程序设计思路。
  • 打赏
  • 举报
回复
写一个什么 for 循环或者 while 循环,又想在循环过程中让用户交互,这种思路本身就是 bug,这本身就是没有学过相关编程知识的体现。交互是编程设计的“边界”,也就是说交互就需要让你的过程“终止”,让出控制权。每一次你改变 this.Opacity 之后就要结束你的过程,然后定时器驱动下,过一段时间再执行你自己的代码。交互系统的编程设计就是要懂得起码的“事件驱动”变成设计知识,不会去胡乱一大堆“死循环+Sleep+阻塞”语句来模拟直截了当的事件驱动机制。
  • 打赏
  • 举报
回复
引用 2 楼 sj490790083 的回复:
那应该如何达到我的效果呢,就是主线程被一些操作阻塞了不要影响我创建的窗体的动作
主线程阻塞了,当然就不能创建窗体。 怎么这个魔怔呢?死活硬要阻塞主线程?你该做的、不该做的,硬要颠倒?
sj490790083 2017-08-03
  • 打赏
  • 举报
回复
引用 1 楼 Libby1984 的回复:
你这样做完全没有意义。你是想在另一个线程中创建窗口。但是用BeginInvoke,其实就是委托主线程显示窗口,最终还是在主线程中做的显示操作,所以还不如直接在主线程中完成。而且你在线程中Form2 frm2 = new Form2();应该是不成功的。
那应该如何达到我的效果呢,就是主线程被一些操作阻塞了不要影响我创建的窗体的动作
  • 打赏
  • 举报
回复
你这样做完全没有意义。你是想在另一个线程中创建窗口。但是用BeginInvoke,其实就是委托主线程显示窗口,最终还是在主线程中做的显示操作,所以还不如直接在主线程中完成。而且你在线程中Form2 frm2 = new Form2();应该是不成功的。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧