是否存在让异步完成事件在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之后?我无法访问启动代码。
答案 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
}