Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 第二次BeginInvoke呼叫索赔已完成。为什么?_C#_.net_Multithreading_Begininvoke_Iasyncresult - Fatal编程技术网

C# 第二次BeginInvoke呼叫索赔已完成。为什么?

C# 第二次BeginInvoke呼叫索赔已完成。为什么?,c#,.net,multithreading,begininvoke,iasyncresult,C#,.net,Multithreading,Begininvoke,Iasyncresult,我反复使用BeginInvoke调用一个方法。每次调用后,我都调用EndInvoke 问题是,对于第二个调用,返回的IAsyncResult中的IsCompleted成员在BeginInvoke调用之后立即设置为true 这会导致故障,因为程序会认为第二次调用已完成 为什么会这样做?我如何检测第二次呼叫何时真正完成 Declarations: IAsyncResult ar; Mercury.J4000.Ui.frmMain.doPrintsDelegate printCallback; T

我反复使用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);

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

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

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

IAsyncResult ar;
ar = printCallback.BeginInvoke(...);
// do some other stuff
ar = printCallback.BeginInvoke(...);
如果第一个异步操作没有在第二个异步操作开始之前完成,那么您将丢失
IAsyncResult
值。它被第二次呼叫覆盖

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

这个问题可能会帮助您:


我也建议您考虑使用异步回调的回调。这样,正确的

IAsyncResult
将作为参数传递给回调,并且不会出现歧义。但是,使用
异步回调
,可能需要对代码进行重大重构。

我假设您正在执行以下操作:

IAsyncResult ar;
ar = printCallback.BeginInvoke(...);
// do some other stuff
ar = printCallback.BeginInvoke(...);
如果第一个异步操作没有在第二个异步操作开始之前完成,那么您将丢失
IAsyncResult
值。它被第二次呼叫覆盖

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

这个问题可能会帮助您:


我也建议您考虑使用异步回调的回调。这样,正确的

IAsyncResult
将作为参数传递给回调,并且不会出现歧义。但是,使用
异步回调
,可能需要对代码进行重大重构。

是否介意共享代码?请显示代码。不要让我们猜测你做错了什么。用代码更新你的问题,而不是将其作为注释发布。你需要发布可以重现问题的代码。你介意共享你的代码吗?请显示代码。不要让我们猜测您做错了什么。请使用代码更新您的问题,而不是将其作为注释发布。您需要发布可以重现问题的代码。是的,我使用的是相同的变量,因为Microsoft文档中对EndInvoke参数作了如下说明:“调用BeginInvoke时返回的表示特定调用异步操作的IAsyncResult。”@AlankDd“表示特定调用异步操作”表示每次调用BeginInvoke时都需要一个新变量来跟踪结果。@AlankDd-然后请将我的响应标记为答案(因为jim在我回答10分钟后给出了相同的答案)是的,我使用了相同的变量,因为Microsoft文档对EndInvoke参数做了这样的描述:“表示特定调用异步操作的IAsyncResult,在调用BeginInvoke时返回。”@AlankDd“表示特定调用异步操作“意味着您每次调用BeginInvoke时都需要一个新变量来跟踪结果。@alankdkd-然后请将我的回答标记为答案(因为jim在我之后10分钟回答了相同的答案)