在异步中运行oncomplete事件

时间:2015-06-08 14:30:56

标签: c# multithreading asynchronous

是否存在让异步完成事件在Async中运行的问题。从外部dll调用oncomplete事件。外部dll使用Async,我正在为它创建一个隐藏多线程的包装器。

我尝试过使用AutoResetEvents但这些卡在WaitOne上,因为重置AutoResetEvent的oncomplete事件仅在函数完成后运行。

从我从外部Dll中拾取的内容,需要将对象树同步到主窗体才能运行。这会强制一个线程上的所有内容。 GetTag被称为GetTag(this)。

protected EventWaitHandle SyncEvent;
public string GetTag(object syncObject)
    {
        string lResult = "";
        SyncEvent = new AutoResetEvent(false);
        XiServer lOPCServer = new XiServer(OPCServer.ServerID, OPCServer.ApplicationName, syncObject); //create local instance of server synced to mainform
        lOPCServer.Initiate(OnInitiated2, null); //Connect server
        SyncEvent.WaitOne(); //Wait here for for connect to finish, Freezes here

        if  (ServerTree == null)
            ServerTree = new ObjectTree(lOPCServer, lOPCServer.ServerInfo.ServerName);
        DialogResult dlr = ServerTree.ShowDialog();
        if (dlr == DialogResult.OK)
        {
            lResult =  ServerTree.SelectedObject.InstanceId.FullyQualifiedId;
        }
        lOPCServer.Dispose();
        return lResult;
    }
private void OnInitiated2(Exception aError, object asyncState)
    {
        if (aError != null)
        {
            GlobalException = aError;
        }
        SyncEvent.Set();            
    }

所以简而言之,是否有一些我可以让代码等到Initiate被finsihed之后?我无法访问启动代码。

1 个答案:

答案 0 :(得分:-1)

好的,我发现了这个。 我一直在检查应该在启动功能上最后设置的字段。 在服务器对象上,我使用isConnected字段

while ((lOPCServer.IsConnected == false) && (lTimeout < 60000)) //1 min timeout
{
    Thread.Sleep(10);
    lTimeout += 10;
}

if (lTimeout >= 60000)
{
    return ""; //Server initaite timed out
}