如何使xamarin中的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

我有一个TCP服务器,其启动方法如下所示:

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();});`而且它是有效的。。这是预期的方式吗??为什么?