红色为主要问题
先看代码片断
void Moveing()
{
//开启一个新的线程运行动画数据 System.Threading.Thread thread = new System.Threading.Thread( new System.Threading.ThreadStart(UpDateImage));
//如果此处加入 thread.Join() 将导致在子线程中无法更新UI导致死锁
//此处若加入MessageBox时并不影响thread更新UI,但同时可阻断代码继续运行
//如何可以实现像MessageBox这种阻止代码运行的方案?
//MessageBox.Show("Test");
//此处需要等待 A1 处执行完毕才执行,如何实现?
this.Content = "Done";
}
void UpDateImage()
{
int count =10;//更新次数
//使用一个时间控件每个时间更新UI
System.Timers.Timer timer = new System.Timers.Timer(); timer.Interval = 100;
timer.Elapsed += delegate {
//此处更新UI需使用主线程
this.Dispatcher.Invoke(new Action( delegate() {
//mainImage是一个Image控件 this.mainImage.Source = //将Image的背景更新
} ) , null);
count--;
if(count
4 回答
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
阻塞主线程的确不是好办法。像一楼说的那样设计也不错啊。。我这边提供一种你想要的效果实现,使用:
Application.DoEvents();
int count = 10;//更新次数
public Form1()
{
InitializeComponent();
}
void UpDateImage()
{
//使用一个时间控件每个时间更新UI
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 100;
timer.Elapsed += delegate
{
//此处更新UI需使用主线程
this.BeginInvoke(new Action(
delegate()
{
Thread.SpinWait(1000);
//mainImage是一个Image控件
this.label1.Text = count.ToString();
}
)
, null);
System.Threading.Interlocked.Decrement(ref count);
if (count <= 0)
{
//A1
timer.Stop();
}
};
timer.Start();
}
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread thread = new System.Threading.Thread(
new System.Threading.ThreadStart(UpDateImage));
thread.Start();
while (Thread.VolatileRead(ref count) != 0)
{
Application.DoEvents();
}
this.label1.Text = "456";
}
- 4 回答
- 0 关注
- 754 浏览
添加回答
举报
0/150
提交
取消