Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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# Thread.join()阻塞主线程直到完成_C#_Multithreading - Fatal编程技术网

C# Thread.join()阻塞主线程直到完成

C# Thread.join()阻塞主线程直到完成,c#,multithreading,C#,Multithreading,这个问题与我从这个问题中收到的一些评论有关: 我有以下代码: myObject object1 = null; Thread obj1Thread = new Thread(() => { object1 = _myService.GetMethod(variable1, variable2); }); obj1Thread.Start(); obj1Thread.Join(); myObject object2 = null; Thread obj2Thread = new Thr

这个问题与我从这个问题中收到的一些评论有关:

我有以下代码:

myObject object1 = null;
Thread obj1Thread = new Thread(() => { object1 = _myService.GetMethod(variable1, variable2); });
obj1Thread.Start();
obj1Thread.Join();


myObject object2 = null;
Thread obj2Thread = new Thread(() => { object2 = _myService.GetMethod2(variable3, variable4); });
obj2Thread.Start();
obj2Thread.Join();
我对该准则的理解如下:

这段代码将创建2个新线程,并发运行指定的方法,暂停主线程,直到这两个线程都完成,然后继续执行

但是,根据上面问题中的一些注释,下面的代码
obj1Thread.Join()将不会执行,直到
obj1Thread
完成

有人能确认这是否正确吗

如果是这样,这基本上意味着代码根本不是多线程的,而是按顺序运行的

2进一步的要点/问题

-如何使这段代码同时运行,并且在主线程继续之前在指定点等待所有线程完成

-我运行了10次此方法,使用.join()平均快了0.5秒-如果代码基本上是按顺序运行的,为什么我会看到性能提高?

您应该在另一个位置为每个线程调用
join()

myObject object1 = null;
Thread obj1Thread = new Thread(() => { object1 = _myService.GetMethod(variable1, variable2); });
obj1Thread.Start();    

myObject object2 = null;
Thread obj2Thread = new Thread(() => { object2 = _myService.GetMethod2(variable3, variable4); });
obj2Thread.Start();

obj1Thread.Join();
obj2Thread.Join();
在这种情况下,将启动两个线程,然后您才应该等待它们。

您应该在另一个位置为每个线程调用
Join()

myObject object1 = null;
Thread obj1Thread = new Thread(() => { object1 = _myService.GetMethod(variable1, variable2); });
obj1Thread.Start();    

myObject object2 = null;
Thread obj2Thread = new Thread(() => { object2 = _myService.GetMethod2(variable3, variable4); });
obj2Thread.Start();

obj1Thread.Join();
obj2Thread.Join();
在这种情况下,将启动两个线程,然后您才应该等待它们。

Join()
的调用将阻止当前线程,这意味着在第一次调用
GetMethod
完成之前,您的第二个线程既没有创建也没有启动

从.NET Framework 4.0开始,建议并行执行两个操作的方法是使用

您可以使用
Parallel.Invoke
方法:

myObject object1 = null;
myObject object2 = null;
Parallel.Invoke(
    () => object1 = _myService.GetMethod(variable1, variable2),
    () => object2 = _myService.GetMethod2(variable3, variable4)
);
myObject object1 = null;
myObject object2 = null;
Task t1 = Task.Run(() => object1 = _myService.GetMethod(variable1, variable2));
Task t2 = Task.Run(() => object2 = _myService.GetMethod(variable3, variable4));
await Task.WhenAll(t1, t2);
它接受任意数量的操作并执行它们,可能是并行的。所有操作完成后,该方法返回

如果要等待并行操作异步完成,可以启动两个单独的任务并使用
任务等待它们。whalll
方法:

myObject object1 = null;
myObject object2 = null;
Parallel.Invoke(
    () => object1 = _myService.GetMethod(variable1, variable2),
    () => object2 = _myService.GetMethod2(variable3, variable4)
);
myObject object1 = null;
myObject object2 = null;
Task t1 = Task.Run(() => object1 = _myService.GetMethod(variable1, variable2));
Task t2 = Task.Run(() => object2 = _myService.GetMethod(variable3, variable4));
await Task.WhenAll(t1, t2);
调用
Join()
会阻止当前线程,这意味着在第一次调用
GetMethod
完成之前,不会创建或启动第二个线程

从.NET Framework 4.0开始,建议并行执行两个操作的方法是使用

您可以使用
Parallel.Invoke
方法:

myObject object1 = null;
myObject object2 = null;
Parallel.Invoke(
    () => object1 = _myService.GetMethod(variable1, variable2),
    () => object2 = _myService.GetMethod2(variable3, variable4)
);
myObject object1 = null;
myObject object2 = null;
Task t1 = Task.Run(() => object1 = _myService.GetMethod(variable1, variable2));
Task t2 = Task.Run(() => object2 = _myService.GetMethod(variable3, variable4));
await Task.WhenAll(t1, t2);
它接受任意数量的操作并执行它们,可能是并行的。所有操作完成后,该方法返回

如果要等待并行操作异步完成,可以启动两个单独的任务并使用
任务等待它们。whalll
方法:

myObject object1 = null;
myObject object2 = null;
Parallel.Invoke(
    () => object1 = _myService.GetMethod(variable1, variable2),
    () => object2 = _myService.GetMethod2(variable3, variable4)
);
myObject object1 = null;
myObject object2 = null;
Task t1 = Task.Run(() => object1 = _myService.GetMethod(variable1, variable2));
Task t2 = Task.Run(() => object2 = _myService.GetMethod(variable3, variable4));
await Task.WhenAll(t1, t2);

没有必要提出新问题。只需更新您的旧问题,在编辑中处理注释即可。“根据上述问题中的一些注释,obj1Thread.Join();下面的代码在obj1Thread完成之前不会执行”-错误。相反,在第一个线程连接被解锁之前,您将无法创建第二个线程,从而使创建线程的整个想法变得糟糕。与同步运行服务方法相比,它的性能甚至更低(由于必须创建线程的开销)。通常,您会先创建并启动几个作业,然后以某种方式(
Task.whalll
是可能的)等待它们完成。
如果是,这基本上意味着代码根本不是多线程的,而是并发运行。
它确实是多线程的。主螺纹和OBJ10螺纹<代码>连接()
等待线程完成。这是正常的行为。在上面发布的代码中没有“暂停主线程,直到两个线程都完成”的内容。见msdn。阅读示例代码中的绿色注释:不需要新问题。只需更新您的旧问题,在编辑中处理注释即可。“根据上述问题中的一些注释,obj1Thread.Join();下面的代码在obj1Thread完成之前不会执行”-错误。相反,在第一个线程连接被解锁之前,您将无法创建第二个线程,从而使创建线程的整个想法变得糟糕。与同步运行服务方法相比,它的性能甚至更低(由于必须创建线程的开销)。通常,您会先创建并启动几个作业,然后以某种方式(
Task.whalll
是可能的)等待它们完成。
如果是,这基本上意味着代码根本不是多线程的,而是并发运行。
它确实是多线程的。主螺纹和OBJ10螺纹<代码>连接()等待线程完成。这是正常的行为。在上面发布的代码中没有“暂停主线程,直到两个线程都完成”的内容。见msdn。阅读示例代码中的绿色注释: