日期:2014-05-17  浏览次数:20821 次

在 Windows 窗口程序中不能使用 delegate 来异步执行,请帮忙看下是什么问题,谢谢
Hi,

在 Windows 窗口程序中不能使用 delegate 来异步执行,请帮忙看下是什么问题,谢谢.



public partial class TestFrame : Form
{

private void testButton_Click(object sender, EventArgs e)
{
            //如果是直接在按钮点击事件里面,直接调用该方法的话,会导致整个窗口都定住,不能动了。
            //必须要等到 doSomthingConsumingTimes() 方法执行完,窗口才能动,才能进行其他操作。
            //this.doSomthingConsumingTimes();


            //这里面尝试使用网上的例子,目的是使到 button 点击的时候,
            //让窗口异步调用一下 doSomthingConsumingTimes 然后,窗口还可以正常操作其他功能。
            //但是,使用这个方法一运行,就出错了,不知是什么原因。
            testDelegate testDelegate = new testDelegate(this.doSomthingConsumingTimes);
            AsyncCallback asyncCallback = new AsyncCallback(testDelegateCallback);
            testDelegate.BeginInvoke(asyncCallback, testDelegate);
}

private void doSomthingConsumingTimes() {
       //这里面会同步执行一大段数据同步的操作,需要很长时间,
       //在这过程里面,会调用窗口的进度条来显示进度,
       
}

//这里面按照例子定义了这样两个异步执行的方法
//这里面有一点与网上例子不同的是,这些 delegate 方法也是与 doSomthingConsumingTimes 方法在同一个 Form 的 class 下,不知是否定义有问题。
private delegate void testDelegate();
private void testDelegateCallback(IAsyncResult asyncResult)
{
            testDelegate testDelegate = (testDelegate)asyncResult.AsyncState;
            testDelegate.EndInvoke(asyncResult);
}

}



------解决方案--------------------
根本没明白委托的使用,其实可以使用BackgroundWork控件就可以了,参考:http://www.cnblogs.com/zhili/archive/2013/05/11/EAP.html
------解决方案--------------------
private void testButton_Click(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(h=> doSomthingConsumingTimes());
}

private void doSomthingConsumingTimes() {
{
      ........
      testButton.BeginInvoke(new Action(()=> testMethod2());
      ........
}

------解决方案--------------------
引用:
不是说 delegate 可以调用任何方法的吗?
[/code]

不懂你说的是什么意思?什么叫