0

我用 BeginInvoke 反复调用一个方法。每次通话后,我都会调用 EndInvoke。

问题在于,对于第二次调用,返回的 IAsyncResult 中的 IsCompleted 成员在 BeginInvoke 调用之后立即设置为 true。

这会导致故障,因为程序会认为第二次调用已完成。

为什么会这样做,我如何检测第二次通话何时真正完成?

Declarations:
IAsyncResult ar;
Mercury.J4000.Ui.frmMain.doPrintsDelegate printCallback;


The BeginInvoke call:
ar = printCallback.BeginInvoke (jobNameArray, copies, distances, null, null);


The EndInvoke call (in another method):
printCallback.EndInvoke(ar);
4

2 回答 2

2

我假设你正在做这样的事情:

IAsyncResult ar;
ar = printCallback.BeginInvoke(...);
// do some other stuff
ar = printCallback.BeginInvoke(...);

如果第一个异步操作在第二个异步操作开始之前没有完成,那么你将失去IAsyncResult价值。它被第二次调用覆盖。

不知何故,您必须跟踪各个IAsyncResult引用并将它们与您所做的调用相关联。如果您只有一两个,您可以轻松地跟踪单个变量或集合(List通常是数组)。

这个问题可能会对您有所帮助: 我可以使用委托的单个实例来启动多个异步请求吗?

我还建议您考虑为异步委托使用回调。这样,正确IAsyncResult的作为参数传递给回调,并且没有歧义的机会。AsyncCallback但是,使用可能需要对代码进行重大重构。

于 2010-09-23T19:42:36.127 回答
2

我的猜测是您在两个调用中都使用了相同的“ar”变量,因为您已将其声明为一个字段。每个调用都应该有自己的实例;将字段声明为,List<IAsyncResult>并编写必要的管道来初始化它并将每个结果与每个调用相关联。您没有为我们提供足够的代码来帮助您完成该部分(实际上这个答案是一个猜测,因为您没有提供足够的代码。)

于 2010-09-23T19:29:42.993 回答