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

时间:2011-08-08 21:15:35

标签: c# multithreading

我有一个从2个区域加载数据的方法。目前它的进程是region1,然后是进程区域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;
    }

-

2 个答案:

答案 0 :(得分:5)

哇,加载问题。我必须在这里做出一些假设:

  1. 您使用的是.NET 4.0
  2. ProcessMessage方法不访问任何受同时调用它的多个线程影响的非受保护的共享状态。
  3. Logger.Log也不会访问任何受同时调用它的多个线程影响的非受保护的共享状态。
  4. 有了这个,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方法的样子,请在评论中告诉我,我将提供一个示例。

答案 1 :(得分:0)

除了@Drew Marsh在这里回答如果您使用的是旧版本的.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 ..