Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在有限任务中触发并忘记的任务与背景_C#_Multithreading_Task_Semaphore - Fatal编程技术网

C# 在有限任务中触发并忘记的任务与背景

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

我在考虑这两种选择。 我不知道每秒调用多次的Task.Run()是否性能不佳,而不是具有信号量的无限线程

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
至少同样快,如果不是因为引入了并发。