我有这个程序,它有两个异步方法,它们想在同一时间在日志中写一些东西。
class Program
{
private const string LOG_FILE = "Log.txt";
private static object _Lock = new object();
static void Main(string[] args)
{
var p = new Program();
new Task(p.Func1).Start();
new Task(p.Func2).Start();
Console.ReadKey();
}
private async void Func1()
{
for (int i = 0; i < 10; i++)
this.Log("1");
}
private async void Func2()
{
for (int i = 0; i < 10; i++)
this.Log("2");
}
private void Log(string msg)
{
lock(_Lock)
{
File.AppendAllText(LOG_FILE, msg);
}
}
}
输出是这样的“11222222222211111111”,可能会改变。为什么输出不是“12121212121212121212”?
如果我是正确的,那么Func2将等到Func1将“1”写入日志文件。然后Func2将写入“2”并且Func1将等待。
答案 0 :(得分:2)
异步并不意味着你交替运行。这意味着你给任何人选择运行。 (同样来自抓住锁)
有点像这样
结果是任何线程都可以以任何顺序登录。或者1个线程在其他线程有机会运行之前完成所有工作。
正如Yacoub指出的那样,任务1&amp; 2在不同的核心上运行。但锁定原则仍然适用。拥有它的第一个线程将执行。根据算法(通常在OS或甚至处理器/程序集级别),锁定语句可能没有公平/排队机制。