C# 在有限任务中触发并忘记的任务与背景
我在考虑这两种选择。 我不知道每秒调用多次的Task.Run()是否性能不佳,而不是具有信号量的无限线程C# 在有限任务中触发并忘记的任务与背景,c#,multithreading,task,semaphore,C#,Multithreading,Task,Semaphore,我在考虑这两种选择。 我不知道每秒调用多次的Task.Run()是否性能不佳,而不是具有信号量的无限线程 public long AddLog(Log aLog) { _buffer.Enqueue(aLog); _sm.Release(); } 1-开火然后忘记 ... Task.Run(async () => { //Do(); }); 2-背景不确定性任务 我简化了代码,但想法是,线程正在等待信号处理 起始线程 ctor() { _thread
public long AddLog(Log aLog)
{
_buffer.Enqueue(aLog);
_sm.Release();
}
1-开火然后忘记
...
Task.Run(async () =>
{
//Do();
});
2-背景不确定性任务
我简化了代码,但想法是,线程正在等待信号处理
起始线程
ctor()
{
_thread = new Thread(WriteLog);
_thread.Start();
}
排队和释放信号量
public long AddLog(Log aLog)
{
_buffer.Enqueue(aLog);
_sm.Release();
}
每次发布sm时的处理
private void WriteLog()
{
while (true)
{
try
{
// Wait release to write log
_sm.Wait(Timeout.Infinite);
var xBuffer = _buffer.Dequeue()
// Do()
}
catch
{
}
}
这是非常可疑的
Task.Run(异步()=>
您正在将一个异步工作负载卸载到线程池线程,其次,您为什么要编写自己的日志?只需使用一个经过大量测试的工作框架,它可以为您解决所有问题。代码很旧,我一点也不喜欢它。它不仅仅是abbout logger,无尽的线程用于代码中的许多事情。我只想为一个简单任务替换所有运行后台的无休止线程。Run()每次呼叫。喜欢发送短信、电子邮件和其他我不需要等待返回的东西。这两个选项是不等效的。带有缓冲区和信号灯的线程按顺序运行排队的作业,而任务。无需协调就到处运行会导致一些作业同时运行。你不同意吗是否担心与并发执行随机作业相关的线程安全问题?“您不担心与同时运行随机作业相关的线程安全问题吗?”这没问题。必要时,我可以在任务的关键点上使用信号量或类似的方法来防止。在我看来,没有什么解决方案是最好的,但我没有太多事情要做。目前每个客户端都创建了很多线程(比如每个客户端10个线程),所以我怀疑,如果将此更改为执行某些任务(如在azure上上载、发送电子邮件和短信以及其他任务)任务.Run
非常有效,那么我希望从单线程解决方案切换到任务.Run
至少同样快,如果不是因为引入了并发。