我有一个C#类库(.Net 3.5)编译为dll并导入Unity3D。在某些方法中,我必须在继续主进程之前等待主线程。所以我使用ManualResetEvent对象在超时前等待指定的持续时间。 但是在Unity3D中它不起作用。它没有等待定义的时间。当尝试使用ManualResetEventSlim时也会发生同样的情况。
有没有人知道阻止主线程的替代方法? 我已经使用DateTime尝试了Thread.Sleep()和while循环,但在这两种情况下Unity在我开始播放模式之前就崩溃了。
修改
发布一些代码很难,我会尽力解释。我想在WPF应用程序和Unity3D之间建立网络连接。当客户端向服务器发送请求时,例如接收对象列表,有必要在说再见之前等待。 这只是一个摘录。 messenger对象发送消息。然后将调用ManualResetEvent(它位于属性WaitEvent中)。超时后,我看看哪个州有我的等待消息。在每个等待模式下,将抛出异常或返回响应。
try
{
this.InternalMessenger.SendMessage(message);
waitingMessage.WaitEvent.WaitOne(timeout);
switch (waitingMessage.CurrentState)
{
case WaitMode.Cancelled:
throw new Exception("Disconnected before response received.");
case WaitMode.Waiting:
throw new Exception("Timeout occured. Can not received response.");
}
return waitingMessage.Response;
}
没有Unity3D它没有任何问题,所以它应该。 到现在为止,我想,Unity将与.Net 3.5合作。但是当我不得不使用.Net 2.0时,我必须更改一些内容..你知道我在哪里可以获得.Net 2.0的System.Threading.dll吗?
感谢您的帮助。
可能的解决方案:
我没有调用 WaitOne 而是调用委托。这将在库外设置,我使用了一个属性。
在dll中:
public delegate void Wait(int timeout);
public class A
{
private int timeout = 60000;
public static Wait Wait { get; set; }
public void Request(string request)
{
this.SendMessage(request);
this.Wait(this.timeout);
// ....
}
}
在Unity3D中:
public void Start()
{
A.Wait = (timeout) => { System.Threading.Thread.Sleep(timeout); };
// ... continue working
}
我知道,这是一个肮脏的黑客,它不像我计划的那样工作。另外我不得不说:当我测试它时,Unity3D非常不稳定。 但也许,总有一天,有人会有更好的想法或解决方案。