C#将更大的方法分解为两个线程

时间:2010-11-29 12:16:28

标签: c# multithreading

如果我有一个由两个小方法组成的大方法:

public int LargeMethod() 
{ 
int result = 0; 
result += SmallMethodA(); 
result += SmallMethodB(); 
}

这两个小方法都会阻止我的程序至少2秒钟,我相信如果我让这两个方法在自己的线程中运行,它的性能会更好。

你能建议一个编程模型吗?

6 个答案:

答案 0 :(得分:4)

如果您使用的是.NET 4,则可以使用任务

public int LargeMethod()
{
    int result = 0;
    Task<int> t1 = new Task<int>(SmallMethodA);
    Task<int> t2 = new Task<int>(SmallMethodB);
    t1.Start();
    t2.Start();
    result += t1.Result;
    result += t2.Result;
    return result;
}

答案 1 :(得分:2)

请阅读 Task Parallel Library 以获取更多信息,此处您有解决方案:

Task<int>[] taskArray = new Task<int>[]
   {
       Task<int>.Factory.StartNew(() => SmallMethodA()),
       Task.Factory.StartNew(() => SmallMethodB()),           
   };

int result = 0;
for (int i = 0; i < taskArray.Length; i++)
{
    result += taskArray[i].Result;
}

答案 2 :(得分:1)

CLR2:

  • 您可以为方法定义委托,创建委托的实例并使用“BeginInvoke / EndInvoke”方法。
  • 将“ThreadPool”用于“EnqueueWorkerItem”
  • 使用System.Thread创建新线程并在其上启动方法。

CLR4:

  • 使用任务库
  • 还原CLR2模式

希望这有帮助,

PS;你看着'Parallel Block'模式。

答案 3 :(得分:0)

如果操作很短,我可能会将对它们的调用放入使用ThreadPool执行的匿名方法中,并使用Interlocked类来更新result变量

答案 4 :(得分:0)

任务怎么样?未经测试的代码如下......

Task<int> t1 = new Task<int>(() => return SmallMethodA());
Task<int> t2 = t1.ContinueWith((t) => return t.Result + SmallMethodB());
t1.Start();

当然,你可以在一个任务中包装SmallMethodA和SmallMethodB。如果您之后正在写入UI,请确保使用在当前线程上下文中运行的ContinueWith任务。

答案 5 :(得分:0)

我喜欢Albin Sunnanbo的回答(http://stackoverflow.com/questions/4303605/c-breaking-larger-method-into-two-threads/4303662#4303662)

但是只用了一个叉子就可以让它更快更简洁:

public int LargeMethod()
{    
    var t1 = new Task<int>(SmallMethodA);
    t1.Start();
    int result = SmallMethodB();    
    result += t1.Result;    
    return result;
}

编辑更像是这样:

public int LargeMethod()
    {    
        var t1 = new Task<int>.Factory.StartNew(SmallMethodA);
        return SmallMethodB() + t1.Result;
    }

GJ