如何使xamarin中的TCP服务器不冻结我的应用程序
我有一个TCP服务器,其启动方法如下所示:如何使xamarin中的TCP服务器不冻结我的应用程序,xamarin,tcplistener,Xamarin,Tcplistener,我有一个TCP服务器,其启动方法如下所示: public async Task Start() { using (Canceler.Token.Register(() => listener.Stop())) { try { listener.Start(); var tcpClient = await listener.AcceptTcpClientAsync(); v
public async Task Start()
{
using (Canceler.Token.Register(() => listener.Stop()))
{
try
{
listener.Start();
var tcpClient = await listener.AcceptTcpClientAsync();
var clientStream = tcpClient.GetStream();
while(!CloseAll)
{
while (!clientStream.DataAvailable)
{
if (CloseAll)
{
break;
}
}
Byte[] bytes = new Byte[tcpClient.Available];
clientStream.Read(bytes, 0, bytes.Length);
String data = Encoding.UTF8.GetString(bytes);
Debug(data);
}
}
catch (Exception exc)
{
Debug(exc.Message);
Canceler.Token.ThrowIfCancellationRequested();
throw;
}
}
}
然后处理它的通信类如下所示:
internal async void Init()
{
DebugMessage("initializing gameBrain");
TCP = new TCPController();
TCP.newDebugMessage += Debug;
await TCP.Start();
}
在页面的最顶端,我们有:
public MainPage(GameBrain _brain)
{
InitializeComponent();
Brain = _brain;
Brain.newMessageToUI += NewMessageFromBrain;
Brain.Init();
}
我运行的东西,它的工作在一开始。UI是响应性的(我添加了一个带有displayAlert的按钮用于测试)
我注意到系统在TCP客户端连接后冻结。在开始的时候,但是。。。我以为这是意料之中的
我认为当应用程序被释放时,Start将在另一个线程中运行。老实说,我过去习惯于做幕后工作,但现在我正从幕后工作转移到任务上,显然有些东西我不懂
应该怎样做呢 在C#中,async
和wait
用于允许代码在某些异步进程完成时继续执行。这并不意味着您正在另一个线程上启动一个并行进程
当你称之为:
internal async void Init()
{
(..)
await TCP.Start();
}
您只是对运行时说,TCP.Start()
最终将在执行过程中启动某个异步进程(如对第三方的HTTP请求),并且允许它在TCP.Start()
之后执行代码,而不是等待TCP.Start()
要像普通的C#方法一样结束,我们正在处理
如果希望并行运行TCP.Start()
,应该创建一个新的Task
,在其中调用如下代码中的方法(我可能在正确的语法上不及格)
现在,TCP.Start()
方法将与应用程序的其余部分并行执行
在C#中,async
和await
用于在某些异步进程完成时允许代码继续执行。这并不意味着您正在另一个线程上启动一个并行进程
当你称之为:
internal async void Init()
{
(..)
await TCP.Start();
}
您只是对运行时说,TCP.Start()
最终将在执行过程中启动某个异步进程(如对第三方的HTTP请求),并且允许它在TCP.Start()
之后执行代码,而不是等待TCP.Start()
要像普通的C#方法一样结束,我们正在处理
如果希望并行运行TCP.Start()
,应该创建一个新的Task
,在其中调用如下代码中的方法(我可能在正确的语法上不及格)
现在,TCP.Start()
方法将与应用程序的其余部分并行执行
好的,我更改了
等待TCP.Start()代码>由`wait Task.Run(()=>{TCP.Start();});`而且它是有效的。。这是预期的方式吗??为什么?好的,我更改了等待TCP.Start()代码>由`wait Task.Run(()=>{TCP.Start();});`而且它是有效的。。这是预期的方式吗??为什么?