.net WCF事件处理程序的完成
本文关键字:程序 WCF 事件处理 net | 更新日期: 2023-09-27 18:08:15
如何确定WCF的eventandler何时完成?
我有两个静态变量,它们在我用来检查状态的循环完成之前不会被设置。
-
创建变量并使用创建的Asynch函数调用WCF
static var globalResults; static bool myEventComplete; main() { globalResults = null; myEventComplete = false; WCFClient wcf = new WCFClient(); //create event handler for the WCF asynch call wcf.MyFuncCompleted += new EventHandler<MyFuncCompletedEventArgs>wcf_MyFuncCompleted); wcf.MyFuncAsync(wcfParameter.ToString()); int counter = 1; //Need to determine when the event handler is complete to then use the data returned from the WCF while (myEventComplete == false && globalResults == null && counter < 10000) { counter++; } }
//Eventhandler
public static void wcf_MyFuncCompleted(object sender, MyFuncCompletedEventArgs e)
{
globalResults = e.Result;
myEventComplete = true;
}
eventhandler最终在循环完成后更新变量。
如果我将循环复制到两个部分-变量在两个循环之间得到更新-似乎事件处理程序直到循环之后才运行(我不认为是这种情况)-我只是不知道如何从循环内获得更新值
可能发生的情况是,循环几乎是立即运行的(计数到10,000几乎不需要任何时间)。实际上,我希望编译器能优化掉循环,除非你在下面使用计数器。
如果目标是在事件触发时做一些事情-只需在事件本身中调用您想要在事件完成时运行的方法。没有任何循环的必要。您是否只是试图"阻止"代码,直到事件触发/完成?我可能不会这样做,因为它是不需要的——只要继续执行由事件本身调用的其余代码即可。
我同意@Paul Mrozowski的观点。
然而,如果你必须阻塞线程,你可以通过定义一个静态AutoResetEvent对象来阻塞它,并在你的main
中调用WaitOne()方法来阻塞线程并使用Set()来解除阻塞
如果不是非常需要,我不建议这样做。你可以在wcf_MyFuncCompleted
你的main可能看起来像这样:
// You may reduce its accessibility if needed
public static AutoResetEvent SignalMyThread=new AutoResetEvent(false);
main()
{
WCFClient wcf = new WCFClient();
//create event handler for the WCF asynch call
wcf.MyFuncCompleted += new EventHandler<MyFuncCompletedEventArgs>wcf_MyFuncCompleted);
wcf.MyFuncAsync(wcfParameter.ToString());
// wait for one minute at most, you can specify no time to make it wait indefinitely
SignalMyThread.WaitOne(60000);
}
在事件处理程序中调用set:
public static void wcf_MyFuncCompleted(object sender, MyFuncCompletedEventArgs e)
{
SignalMyThread.Set();
}