用于Unity3D的DLL中的ManualResetEvent

时间:2015-02-06 14:36:59

标签: c# multithreading unity3d thread-sleep manualresetevent

我有一个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非常不稳定。 但也许,总有一天,有人会有更好的想法或解决方案。

0 个答案:

没有答案