【问题标题】:C#/WPF/Unity namepipes communication sends messages just in one directionC#/WPF/Unity 名称管道通信仅向一个方向发送消息
【发布时间】:2020-06-09 08:05:42
【问题描述】:

我在解决当前项目中的一个问题时遇到了困难。我正在用 WPF/C# 编写模拟代码,并使用窗口句柄/hwnd 在窗口中包含了一个 Unity-Application,就像在 answer 中所做的“程序员”一样。他还建议使用命名管道进行通信。

但通信仅以一种方式进行 - 服务器(WPF-App)能够向客户端(嵌入式 Unity-App)发送消息。如果我反过来尝试,整个 Unity-App 就会挂断并停止工作。据我所知,只要我刷新编写器或添加 AutoFlush,然后编写 Unity 卡住的东西。

有趣的是,服务器的 InBufferSize 为 0。这可能是问题吗?

这是我在 Unity 中分配给游戏对象的 C# 脚本:

public class pipeCommunicationScript : MonoBehaviour
{
    NamedPipeClientStream client;

    public GameObject console;
    static Text consoleText;

    StreamReader reader;
    StreamWriter writer;

    int counter = 0;


    static bool _threadRunning;
    Thread _thread;

    void Start()
    {
        consoleText = console.GetComponent<Text>();
        consoleText.text = "trying to set up client";

        _thread = new Thread(StartClient);
        _thread.Start();
    }

    void StartClient()
    {
        _threadRunning = true;

        //Client
        consoleText.text = "Attempting to connect to pipe...";
        client = new NamedPipeClientStream(".","UnitySimulationPipe", PipeDirection.InOut);
        if (!client.IsConnected) { client.Connect(); }
        consoleText.text = "Connected to pipe.";

        writer = new StreamWriter(client);
        reader = new StreamReader(client);
        writer.AutoFlush = true;

        InvokeRepeating("sendThroughPipe", 5.5f, 5.5f);

        while (_threadRunning)
        {
            consoleText.text = "IN:" + reader.ReadLine();
        }

        _threadRunning = false;
    }


    void sendThroughPipe()
    {
        try
        {
            client.WaitForPipeDrain();
            writer.WriteLine("test" + counter);
        }
        catch(Exception e)
        {
            consoleText.text = "Exception while sending: " + e;
        }
        consoleText.text = "OUT: test" + counter;
        counter++;
    }


    void OnDisable()
    {
        if (_threadRunning)
        {
            _threadRunning = false;
       _thread.Join();
        }
    }
}

这是我的服务器脚本:

void StartServer()
{
    Task.Factory.StartNew(() =>
    {
        Console.WriteLine("Connection initialisation started");
        var server = new NamedPipeServerStream("UnitySimulationPipe", PipeDirection.InOut);
        server.WaitForConnection();

        while (!server.IsConnected)
        {
            Console.WriteLine("Connection not initialized");
            server.WaitForConnection();
        }

        Console.WriteLine("Connection initialized");


        reader = new StreamReader(server);
        writer = new StreamWriter(server);
        writer.AutoFlush = true;

        writer.WriteLine("startConnection");
        printOnStatusBar("OUT: startConnection");

        connected = true;


        Console.WriteLine("Current pipe readable: " + server.CanRead);

        Console.WriteLine("Pipe InBufferSize: " + server.InBufferSize);

        while (true)
        {
            Console.WriteLine("start while again");

            if (reader.Peek() > 0)
            {
                var l = reader.ReadLine();
                Console.WriteLine(reader.ReadLine());
                Console.WriteLine("read finished");
                server.WaitForPipeDrain();
            }
            Thread.Sleep(500);

        }
    });
}

【问题讨论】:

    标签: c# wpf unity3d


    【解决方案1】:

    事实上,最可能的答案是您提到的 (bufferSize)。 您应该检查您使用的每个对象的 initialyzers 参数。 别担心,我相信你只要在那里搜索就能找到答案。我以前用同样的方式创建这样的代码,它应该工作得很好。

    【讨论】:

      【解决方案2】:

      好的,我将服务器对象的初始化更改为(不同参数的解释here):

      var server = new NamedPipeServerStream("UnitySimulationPipe", PipeDirection.InOut, 1, 0, 0, 1024, 1024);
      

      但我个人认为,这只是一个小错误。我的代码不起作用的主要原因是,我错过了电话

      server.WaitForPipeDrain();
      

      之后

      writer.WriteLine("startConnection");
      printOnStatusBar("OUT: startConnection");
      

      在我的服务器代码中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-25
        • 1970-01-01
        • 2021-02-06
        • 1970-01-01
        • 1970-01-01
        • 2021-03-22
        • 2022-06-20
        • 1970-01-01
        相关资源
        最近更新 更多