关于异步调用的疑问,高手请进

九章落地 2007-07-30 08:34:51
我在读写数据时,有些地方耗时较多,便想显示一个等待的GIF动画来提示用户,部分代码如下:

private delegate void f();//定义一个委托

private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(test));
th.Start();
doSomeThing(...);//这个方法很耗时间,有参数,且不能拆开成小步

}

private void test()
{
Invoke(new f(testff));
}

private void testff()
{
picLoading1.Visible = true;//显示等待动画
}

1、为什么我点击按钮时,图片框上的GIF不动,等执行完doSomeThing方法后才动,这是为什么,如何解决?

2、是把耗时的方法,还是等待画面(进度条)放到新线程来执行呀?那些耗时的方法都有不同的参数,如何传递参数?

请高手不吝赐教,谢谢!
...全文
414 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
豬哥 2011-08-25
  • 打赏
  • 举报
回复
我也在学习这个,帮顶一下,UP
有点扯 2007-08-01
  • 打赏
  • 举报
回复
在当今烂帖子横飞的社区,这样的帖子质量很高。谢谢发贴人。
wuxiangtuan 2007-08-01
  • 打赏
  • 举报
回复
我也学习
wdzr_826 2007-08-01
  • 打赏
  • 举报
回复
恩,多线程不熟悉,学习
九章落地 2007-08-01
  • 打赏
  • 举报
回复
再次感谢您们两位!

Bote_China() 的实现方式我已理解.

我现在的主要的问题是,如何在主线程知道,子线程已经结束了?我用这样的方式:
picLoading1.Visible = true;
Thread th = new Thread(new ThreadStart(dosomething));
th.Start();

while (th.IsAlive)
{
Application.DoEvents();
Thread.Sleep(100);
}
picLoading1.Visible = false;


能实现动画有动,也能拖动窗体,但是当我点界面上的按钮时,并没有响应,而要等到子线程完成,才来响应.

我正在查"songcan(当爱已成往事)"说的方式,如果可以,还请songcan分享个好方法.
songcan 2007-08-01
  • 打赏
  • 举报
回复
汗一个!
bote_china 2007-07-31
  • 打赏
  • 举报
回复
晕哦,dosomething和dosomething(..)是有区别的,看作重载方法吧,不会出现递归调用的情况
private DataSet MyDs;
private delegate void f();
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(doSomeThing));
th.Start();
}
privte void doSomeThing()
{
test();
doSomeThing(...);
test();
Invoke(new f(bindDataGridView));
}
private void doSomeThing(...//参数列表)
{
MyDs= new DataSet();
//填充DataSet;
}
private void test()
{
Invoke(new f(testff));
}
private void testff()
{
picLoading1.Visible = !picLoading1.Visible;}
}
private void bindDataGridView()
{
this.DataGridView1.DataSource=MyDs.Tables[0];
}
vainnetwork 2007-07-31
  • 打赏
  • 举报
回复
关注进展
xwk789xwk 2007-07-31
  • 打赏
  • 举报
回复
不懂,只能帮你顶一下了
Mingle_Qin 2007-07-31
  • 打赏
  • 举报
回复
应该是开僻个新线程处理doSomeThing(...);然后在这个线程中,异步调用图标显示吧...

songcan 2007-07-31
  • 打赏
  • 举报
回复
Bote_China() ( ) 信誉:100 2007-7-30 20:51:11 得分: 0



private delegate void f();
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(doSomeThing));
th.Start();
}

privte void doSomeThing()
{
test();
doSomeThing(...);
test();
}

private void test()
{
Invoke(new f(testff));
}

private void testff()
{
picLoading1.Visible = !picLoading1.Visible }
}

Bote_China()的代码可以实现你想要的功能,根据你的需求你不需要在UI线程里知道开辟的线程已结束,线程并不是启动越多越好。开僻个新线程处理doSomeThing(...)没意义,开一个线程即可
PicLoading1.Visible=false;

privte void doSomeThing()
{
test();
doSomeThing(...);
test();
}
这个方法是一个死循环,好像不符合楼主本意
songcan 2007-07-31
  • 打赏
  • 举报
回复
等待信号量与设置标志位,回调函数皆可,哪一个都可实现
lovefootball 2007-07-31
  • 打赏
  • 举报
回复
你可以看看BackGroundWorker
九章落地 2007-07-31
  • 打赏
  • 举报
回复
TO:songcan(当爱已成往事) && Bote_China()

谢谢您们两位的解答,我之前的疑惑已经清晰很多!尚有些不明之处,还请帮助:
1、如果我把我的程序改成:
PicLoading1.Visible=true;
Thread th = new Thread(new ThreadStart(doSomeThing));
th.Start();

privte void doSomeThing()
{
doSomething(...);
}
//如何在UI线程里知道我开辟的线程已结束?好执行:PicLoading1.Visible=false;


2、如果我想线程执行后,返回一个DataTable,并绑定到一个GridView,如果实现呢?即开辟一个新线程取得数据后绑定到界面的控件上。

xiaoliangwh 2007-07-31
  • 打赏
  • 举报
回复
up
xwk789xwk 2007-07-31
  • 打赏
  • 举报
回复
帮顶
bote_china 2007-07-31
  • 打赏
  • 举报
回复
private MyDataSet
privte void doSomeThing()
{
test();//显示Gif
doSomething(...);//这个方法中取得数据,填充MyDataSet
test();//隐藏Gif
bindDataGridView();//调用一个委托将数据绑定到DataGridView
}
九章落地 2007-07-31
  • 打赏
  • 举报
回复
用BackGroundWorker觉得不方便呢,高手帮帮忙呀

如何在UI线程里知道我开辟的线程已结束?
altery 2007-07-30
  • 打赏
  • 举报
回复
学习
加载更多回复(4)

110,536

社区成员

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

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

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