小编Igo*_*sky的帖子

Task.WaitAll方法与Parallel.Invoke方法

我有示例代码来比较Parallel方法和Task方法的处理时间.这个实验的目标是了解它们是如何工作的.

所以我的问题是:

  1. 为什么Parallel工作得比Task快?
  2. 我的结果是否意味着我应该使用Parallel而不是Task?
  3. 我应该在哪里使用Task和Parallel?
  4. 使用Task与Parallel相比有什么好处?
  5. Task只是ThreadPool.QueueUserWorkItem方法的包装吗?

        public Task SomeLongOperation()
        {
            return Task.Delay(3000);
        }
    
        static void Main(string[] args)
        {
            Program p = new Program();
            List<Task> tasks = new List<Task>();
    
            tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation()));
            tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation()));
    
            var arr = tasks.ToArray();
    
            Stopwatch sw = Stopwatch.StartNew();
            Task.WaitAll(arr);
            Console.WriteLine("Task wait all results: " + sw.Elapsed);
            sw.Stop();
    
            sw = Stopwatch.StartNew();
            Parallel.Invoke(() => p.SomeLongOperation(), () => p.SomeLongOperation());
            Console.WriteLine("Parallel invoke results: " + sw.Elapsed);
            sw.Stop();
    
            Console.ReadKey();
        }
    
    Run Code Online (Sandbox Code Playgroud)

这是我的处理结果: 结果

编辑:

将代码更改为如下所示:

    Program p = new Program();
    Task[] tasks …
Run Code Online (Sandbox Code Playgroud)

c# parallel-processing task

27
推荐指数
2
解决办法
2万
查看次数

C#中的赋值和创建字符串实例有什么区别?

我有示例代码.

var charMass = new char[] { 's', 't', 'r' };
string myString = new string(charMass);
string myString2 = new string(charMass);
string myString3 = "str";
string myString4 = "str";

bool bb1 = Object.ReferenceEquals(myString, myString2);
bool bb2 = Object.ReferenceEquals(myString, myString3);
bool bb3 = Object.ReferenceEquals(myString3, myString4);
Run Code Online (Sandbox Code Playgroud)

为什么bb1和bb2是假的?我知道equals必须显示为true,因为它比较了值,但是那些字符串的内存分配呢?为什么myString3和myString4指向堆中的同一块内存但myString和myString2却没有?

c# string heap

4
推荐指数
1
解决办法
241
查看次数

标签 统计

c# ×2

heap ×1

parallel-processing ×1

string ×1

task ×1