我在一个程序里通过delegate.begininvoke创建了一个线程,用来执行一个新的任务,由于我的委托方法里执行的任务耗时比较长,我想执行的过程中将其中断掉,但主程序不能退出,请问如何能实现?简单代码如下:
public void Write1()
{
Thread.Sleep(40000);
MessageBox.Show("方法1");
}
MyMethodDelegate d1 = new MyMethodDelegate(Write1);
private void button1_Click(object sender, EventArgs e)
{
AsyncResult MyResult1, MyResult2;
MyResult1 = (AsyncResult)d1.BeginInvoke(null, null);
}
private void button2_Click(objece sender,EvevtArgs e)
{
//我想在这里实现 上面d1的中断或退出,该如何实现
}
谢谢!
public void Write1()
{
Thread.Sleep(40000);
MessageBox.Show("方法1");
}
MyMethodDelegate d1 = new MyMethodDelegate(Write1);
private void button1_Click(object sender, EventArgs e)
{
AsyncResult MyResult1, MyResult2;
MyResult1 = (AsyncResult)d1.BeginInvoke(null, null);
}
private void button2_Click(objece sender,EvevtArgs e)
{
//我想在这里实现 上面d1的中断或退出,该如何实现
}
谢谢!
解决方案 »
- 链接中传输中文
- 找不到类型或命名空间名称“SaveFileDialog”(是否缺少 using 指令或程序集引用?)
- datalist选定行取值问题
- 文革正则表达式的问题
- 在C#里面如何保证垃圾搜集线程已经工作完成,或者保证在某段时间里面不要工作?
- 紧急求救:ntext 字符被截断了!为什么??
- 多线程访问控件的问题.我记得我在VS2003里曾经做过直接开一个线程.在线程里调问一个listview.
- 请教一个简单的问题,c# 有没有一个方法,把一个字符串里面的内容,以相反的顺序输出?
- 小妹我快被treeview烦死了,有关treeview于文本文件存储问题,请各位高手帮帮忙
- 我定义了一个label对象数组,不知该怎么实例化??????
- 急.....treeView子节点前面的“+”号不点击,不显示!
- 用EPSON ESC/POS指令写pos打印机程序
MyMethodDelegate d1 = new MyMethodDelegate(Write1);
private void button1_Click(object sender, EventArgs e)
{
AsyncResult MyResult1, MyResult2;
MyResult1 = (AsyncResult)d1.BeginInvoke(null, null);
while(true)//上面要使用回调方法,把判断调不调用d1.EndInvoke,不然像现在这个界面会死在那
{
if(MyResult1.IsCompleted)
{
d1.EndInvoke(MyResult1);
break;
}
else if(isCancel)
{
//取消操作
break;
} }
}
private void button2_Click(objece sender,EvevtArgs e)
{
//我想在这里实现 上面d1的中断或退出,该如何实现
}
{
Thread.Sleep(40000);
if(isCancel)return;
MessageBox.Show("方法1");
} 如果要在这里没执行完就取消,请在这个方法里面判断
推荐舍弃委托BeginInvoke方式改用BackgroundWorker
BackgroundWorker有属性可以支持运行时取消异步操作的行为
真搞不懂,楼主发明一个 delegate.begininvoke,然后就有人把这个delegate附会到control、thread上。这样张冠李戴有什么意义呢?楼主你的 MyMethodDelegate 又是个什么东西能?不知道它是什么,去谈什么 d1.BeginInvoke 谁又有心思去瞎猜呢?
楼主的那个是用关键字delegate 声明委托,我是这样的……
不是有带参数的Thread吗?
IAsyncResult ar = Dl.BeginInvoke(IRSceneName1, endThread, null);
return true;
}
catch (System.Exception)
{
return false;
}
}
//结束Dl的线程
private void EndThread(IAsyncResult ar)
{
Dl.EndInvoke(ar);
}
当线程结束后会自动调用EndThread来结束线程。