首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#/WPF/Unitalname管道通信只向一个方向发送消息

C#/WPF/Unitalname管道通信只向一个方向发送消息
EN

Stack Overflow用户
提问于 2020-06-09 08:05:42
回答 2查看 152关注 0票数 0

在我目前的项目中,我被困在解决一个问题上。我用WPF/C#编写了一个模拟程序,并在窗口中包含了一个Unity,使用window-handles/hwnd,就像“程序员”在这个回答中所做的那样。他还提出了通信的名称管道。

但是通信只是以一种方式工作--服务器(WPF-App)能够向客户端(嵌入式统一应用程序)发送消息。如果我用相反的方法尝试,整个Unity就会停止工作。据我所知,只要我冲洗作者或添加AutoFlush,然后写东西,团结就卡住了。

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

这是分配给GameObject的统一中的C#-脚本:

代码语言:javascript
复制
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();
        }
    }
}

这是我的服务器脚本:

代码语言:javascript
复制
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);

        }
    });
}
EN

回答 2

Stack Overflow用户

发布于 2020-06-09 09:41:05

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

票数 0
EN

Stack Overflow用户

发布于 2020-06-09 17:04:11

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

代码语言:javascript
复制
var server = new NamedPipeServerStream("UnitySimulationPipe", PipeDirection.InOut, 1, 0, 0, 1024, 1024);

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

代码语言:javascript
复制
server.WaitForPipeDrain();

之后

代码语言:javascript
复制
writer.WriteLine("startConnection");
printOnStatusBar("OUT: startConnection");

在我的服务器密码里。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62277845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档