C# 第二次BeginInvoke呼叫索赔已完成。为什么?
我反复使用BeginInvoke调用一个方法。每次调用后,我都调用EndInvoke 问题是,对于第二个调用,返回的IAsyncResult中的IsCompleted成员在BeginInvoke调用之后立即设置为true 这会导致故障,因为程序会认为第二次调用已完成 为什么会这样做?我如何检测第二次呼叫何时真正完成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
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分钟回答了相同的答案)