C#/WPF/Unity 名称管道通信只在一个方向上发送消息



我在解决当前项目中的问题时陷入了困境。我正在用 WPF/C# 编写一个模拟,并使用窗口句柄/hwnd 在窗口中包含一个 Unity 应用程序,就像"程序员"在这个答案中所做的那样。他还建议为通信命名管道。

但通信仅以一种方式工作 - 服务器(WPF-App(能够向客户端(嵌入式Unity-App(发送消息。如果我反过来尝试,整个 Unity 应用程序都会挂起并停止工作。据我所知,一旦我刷新编写器或添加自动刷新,然后编写一些东西,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);
}
});
}

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

好的,我将服务器对象的启动更改为(此处解释不同的参数(:

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

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

server.WaitForPipeDrain();

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

在我的服务器代码中。

最新更新