如何在c#中的异步方法内部同步执行方法?
我开始使用async taks创建客户端和服务器响应的模拟,我让它工作了,但现在我想对每个客户端发送的消息有更多的控制,我通过制作自定义打印行在控制台中打印颜色和标记得到了它,但现在,由于服务器和客户端异步运行,因此控制台上的消息包重叠:如何在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
[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");
}
}