加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

尝试将AsyncCallback添加到BeginInvoke()时C#参数计数不匹配

发布时间:2020-12-16 01:40:03 所属栏目:百科 来源:网络整理
导读:我有主窗体(PrenosForm),我试图异步运行Form2. 它没有回调委托: this.BeginInvoke(cp,new object[] { datoteke,this.treeView1.SelectedNode.FullPath.ToString(),this,efekt },null); //works 1. 不适用于回调委托(参数计数不匹配): this.BeginInvoke(cp,
我有主窗体(PrenosForm),我试图异步运行Form2.

>它没有回调委托:

this.BeginInvoke(cp,new object[] { datoteke,this.treeView1.SelectedNode.FullPath.ToString(),this,efekt },null); //works  1.

>不适用于回调委托(参数计数不匹配):

this.BeginInvoke(cp,new AsyncCallback(callBackDelegate),null); //doesn't work parameter count mismatch 2.

>如果我这样做,可以使用回调委托:

cp.BeginInvoke(datoteke,efekt,null); //works  3.

我的问题是为什么一种方式有效而另一种无效?我是新来的.有人会如此善良地回答我的问题并指出我的错误吗?

private delegate void copyDelegat(List<ListViewItem> datoteke,string path,PrenosForm forma,DragDropEffects efekt);
 private delegate void callBackDelegat(IAsyncResult a);

 public void doCopy(List<ListViewItem> datoteke,DragDropEffects efekt)
 {
     new Form2(datoteke,path,forma,efekt);
 }

 public void callBackFunc(IAsyncResult a)
 {
     AsyncResult res = a.AsyncState as AsyncResult;
     copyDelegat delegat = res.AsyncDelegate as copyDelegat;
     delegat.EndInvoke(a);
 }

public void kopiraj(List<ListViewItem> datoteke,DragDropEffects efekt)
{


 copyDelegat cp = new copyDelegat(doCopy);
 callBackDelegat callBackDelegate = new callBackDelegat(callBackFunc);
 this.BeginInvoke(cp,null); //doesn't work parameter count missmatch 2.
 this.BeginInvoke(cp,null); //works  1.
 cp.BeginInvoke(datoteke,null); //works  3.

}

解决方法

这是因为Control.BeginInvoke()与SomeDelegate.BeginInvoke()具有完全不同的签名.虽然它们的方法名称相同,但它们基本上是不同的方法.从根本上说,在运行时工作方式不同,没有比较.

Control.BeginInvoke()接受委托和对象[].铸在石头上.

私有委托SomeDelegate(mumble,foo,bar)自动创建SomeDelegate.BeginInvoke()方法.谁的签名采用这三个参数,加上两个额外的参数,一个回调和一个状态对象.

一个重要的运行时差异是Control.BeginInvoke()可以调用委托,如果它有异常,那么在UI线程上引发异常.委托的BeginInvoke()方法不会这样做,它会在调用EndInvoke()的回调中重新引发异常.

我知道,非常令人费解,也许他们不应该使用相同的名字.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读