如何在c#中的异步方法内部同步执行方法?

如何在c#中的异步方法内部同步执行方法?,c#,async-await,synchronization,task,C#,Async Await,Synchronization,Task,我开始使用async taks创建客户端和服务器响应的模拟,我让它工作了,但现在我想对每个客户端发送的消息有更多的控制,我通过制作自定义打印行在控制台中打印颜色和标记得到了它,但现在,由于服务器和客户端异步运行,因此控制台上的消息包重叠: [Server]> Wating for a conection... [Client #0]> [Client #1]> Socket connected to -> [SomeIP]:11111 Socket

我开始使用async taks创建客户端和服务器响应的模拟,我让它工作了,但现在我想对每个客户端发送的消息有更多的控制,我通过制作自定义打印行在控制台中打印颜色和标记得到了它,但现在,由于服务器和客户端异步运行,因此控制台上的消息包重叠:

[Server]>       Wating for a conection...
[Client #0]>    [Client #1]>    Socket connected to -> [SomeIP]:11111
Socket connected to -> [SomeIP]:11111
[Server]>       Text received -> Test Client<EOF>
[Client #1]>    Message from server -> Test Server
[Server]>       Wating for a conection...
[Server]>       Text received -> Test Client<EOF>
[Client #0]>    [Server]>       Message from server -> Test Server
这是我自己的打印线方法

    void printLine(string line){
        Console.ForegroundColor = ConsoleColor.Cyan;
        Console.Write("[Client #" + clientID + "]>\t");
        Console.ResetColor();
        Console.WriteLine(line + "\n");
    }

正如评论中所说,您在这里关注的不仅仅是同步/异步,还包括并发资源访问

当您使用任务时,它们由线程池中的不同线程处理,您无法直接控制这些线程

正如在您的问题的评论中再次建议的那样,您可以使用互斥锁等受控方式包装所有prints语句

1) 任务的线程获取(或等待)互斥锁

2) 任务的线程打印所有语句

3) 任务的线程释放互斥锁

确保主线程在启动任务之前创建互斥体,并在任务启动之前释放互斥体。在构造函数中,您可以指定是否希望当前线程拥有互斥锁(在您的情况下为false)。

使用,以序列化打印代码的执行

lock语句获取给定对象的互斥锁 对象,执行语句块,然后释放锁。 当锁被持有时,持有锁的线程可以再次获得 然后松开锁。阻止任何其他线程获取 锁定并等待,直到解除锁定

printLine(“无论什么”)将同步执行它。也许在与控制台交互的代码块周围使用一个
,这样一次只能执行一个代码块(这样它们就能得到预期的颜色等)。C#和.NET提供了大量的机制来确保资源或代码段的互斥。请参见标记重复,以了解这些示例
    void printLine(string line){
        Console.ForegroundColor = ConsoleColor.Cyan;
        Console.Write("[Client #" + clientID + "]>\t");
        Console.ResetColor();
        Console.WriteLine(line + "\n");
    }
private readonly object _sync = new object();

void printLine(string line)
{
    lock (_sync)
    {
        Console.ForegroundColor = ConsoleColor.Cyan;
        Console.Write("[Client #" + clientID + "]>\t");
        Console.ResetColor();
        Console.WriteLine(line + "\n");
    }
}