.net WCF事件处理程序的完成

本文关键字:程序 WCF 事件处理 net | 更新日期: 2023-09-27 18:08:15

如何确定WCF的eventandler何时完成?

我有两个静态变量,它们在我用来检查状态的循环完成之前不会被设置。

  1. 创建变量并使用创建的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最终在循环完成后更新变量。

如果我将循环复制到两个部分-变量在两个循环之间得到更新-似乎事件处理程序直到循环之后才运行(我不认为是这种情况)-我只是不知道如何从循环内获得更新值

.net WCF事件处理程序的完成

可能发生的情况是,循环几乎是立即运行的(计数到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();
}