0

我有一个 C# 类库 (.Net 3.5) 编译为 dll 并导入到 Unity3D。在某些方法中,我必须在继续主进程之前等待主线程。所以我使用 ManualResetEvent 对象在超时前等待指定的持续时间。但在 Unity3D 中它不起作用。它不是在等待定义的时间。当尝试使用 ManualResetEventSlim 时,也会发生同样的情况。

有没有人知道阻塞主线程的替代方法?我已经尝试过使用 DateTime 的 Thread.Sleep() 和 while-loop,但在这两种情况下,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 在我测试时非常不稳定。但也许有一天,有人会有更好的想法或解决方案。

4

0 回答 0