所以,这个例子试图给出一个我试图修改的更大的系统(即Orchard CMS)的简单视图。因此,它可能不完美。循环依赖与横切关注
我想创建一个通过设置管理的日志记录系统。我遇到的问题是检索设置会导致记录发生。下面是希望能说明问题一个简单的例子:
static void Main(string[] args)
{
string[] messages = "this is a test. but it's going to be an issue!".Split(' ');
Parallel.ForEach(messages, Log);
Console.ReadLine();
}
public static void Log(string message)
{
Console.WriteLine(GetPrefix() + message);
}
public static string GetPrefix()
{
Log("Getting prefix!");
return "Prefix: ";
}
这是一个明显的StackOverflowException
。但是,我该如何解决它?我不能只是禁用日志记录,直到我得到GetPrefix
的响应,因为我可能会错过日志。 (事实上,在这个简单的例子,我想念所有,但第一个。)
static void Main(string[] args)
{
string[] messages = "this is a test. but it's going to be an issue!".Split(' ');
Parallel.ForEach(messages, Log);
Console.ReadLine();
}
static bool _disable = false;
public static void Log(string message)
{
if (_disable)
{
return;
}
_disable = true;
Console.WriteLine(GetPrefix() + message);
_disable = false;
}
public static string GetPrefix()
{
Log("Getting prefix!");
return "Prefix: ";
}
(^坏。)
注意,我目前没有在GetPrefix
方法控制,只有Log
方法。
我不确定是否有办法解决这个问题;我可能需要将其他设置(如配置或单独的设置文件)。然而,如果任何人有想法或建议,我会很乐意尝试任何事情,因为我宁愿现在离开设置(这是在管理界面中)。
你必须同步对'bool _disable'的访问。你失去了并行执行,这在这个例子中很好,因为无论如何,Console.WriteLine是同步的。 – JosephHirn
@Ginosaji:这是一个简单的例子,但实际上,同步会对性能产生严重影响。 – zimdanen
您仍然可以并行处理这些消息并只是同步日志记录。正如我所说,无论如何,Console.WriteLine是同步的,所以你通过锁定'bool _disable'没有任何损失。 – JosephHirn