我如何在线程中旋转这两个进程

本文关键字:进程 两个 旋转 线程 | 更新日期: 2023-09-27 18:04:46

我有一个方法,从2个地区加载数据。目前它处理区域1,然后处理区域2。它是单线程的。我需要同时做它们。下面是当前的代码。请告诉我需要做什么。

在这里输入代码

public override object RProcess()            
{            
      string queueName = Config.AppSettings["MQSIInboundQueueName"];
        string Region1 = Config.AppSettings["Region1"];
        string Region2 = Config.AppSettings["Region2"];
        string returnMessage = string.Empty;
        if (Region1.Trim().Length > 0)
        {                
            returnMessage = ProcessMessage(string.Format(queueName, Region1));
            Logger.Log(returnMessage);
        }
        if (Region2.Trim().Length > 0)
        {
            returnMessage = ProcessMessage(string.Format(queueName, Region2));
            Logger.Log(returnMessage);
        }
        return null;
    }

,

我如何在线程中旋转这两个进程

哇,这个问题很有意思。我必须对我的答案做一些假设:

  1. 你正在使用。net 4.0
  2. ProcessMessage方法不访问任何非受保护的共享状态,这些状态会受到多个线程并发调用的影响。
  3. Logger.Log也不访问任何非受保护的共享状态,这些状态可能会受到多个线程并发调用的影响。

这样,Parallel::Invoke就是你的朋友了:

Parallel.Invoke(
    () =>
    {
       string region1 = Config.AppSettings["Region1"];
       if(region1.Trim().Length > 0)
       {
            string region1ReturnMessage = ProcessMessage(string.Format(queueName, region1));
            Logger.Log(region1ReturnMessage);
       }
    },
    () =>
    {
       string region2 = Config.AppSettings["Region2"];
       if(region2.Trim().Length > 0)
       {
            string region2ReturnMessage = ProcessMessage(string.Format(queueName, region2));
            Logger.Log(region2ReturnMessage);
       }
    });

另外,需要考虑的是,如果由于这些检查而没有实际调用特定区域的ProcessMessage是常见的情况,那么在主线程上预先执行这些检查而不是总是调度多个调用是有意义的。在这种情况下,您需要使用纯TPL任务管理代码,并只动态分配所需的任务数量。只有当这些代码将在某种服务进程本身的负载下执行时,我才会这样做。否则,这是一个过早的优化。如果您想看看原始的TPL方法是什么样子的,请在评论中告诉我,我将提供一个示例。

如果你使用的是旧版本的。net,你可以在新线程中调用每个操作,使用Thread类或ThreadPool.QueueUserWorkItem

//example using Thread class
new Thread(() =>
{
    if (Region1.Trim().Length > 0)
    {                
        returnMessage = ProcessMessage(string.Format(queueName, Region1));
        Logger.Log(returnMessage);
    }
}) { IsBackground = true }.Start();
//example using ThreadPool
ThreadPool.QueueUserWorkItem(new WaitCallback((_) =>
{
    if (Region2.Trim().Length > 0)
    {
        returnMessage = ProcessMessage(string.Format(queueName, Region2));
        Logger.Log(returnMessage);
    }
}));

无论如何,如果您从应用程序中的任何其他位置更新Region1Region2,那么您应该考虑使用同步机制在这里访问它们,例如lock ..