use*_*670 2 .net c# parallel-processing asynchronous async-await
我将尝试用你在下面看到的毫无意义的例子来说明我的问题.
using System;
using System.IO;
namespace PointlessProgram
{
class PointlessClass
{
public static void WriteFooToTextFile ( )
{
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\Hillary\Documents\PointlessFolder\Foo.txt"))
{
file.Write("Foo");
}
}
public static void WriteBarToTextFile ( )
{
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\Hillary\Documents\PointlessFolder\Bar.txt"))
{
file.Write("Bar");
}
}
static void Main()
{
WriteFooToTextFile(); // (A)
WriteBarToTextFile(); // (B)
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,(B)不需要运行,(A)因为它不依赖于产生的任何输出(A),并且更好(A)依赖于(B).假设我的计算机有2个处理器,并且会将所有处理能力用于运行该程序.编译器是否会找出(A)并且(B)可以并行运行,或者它会一个接一个地运行它们除非我明确地编写我的代码以告诉机器(A)在开始执行之前不等待完成(B)?如果是这样,是async- await我如何改变这个执行
===
A
---
B
===
Run Code Online (Sandbox Code Playgroud)
至
========
A | B
========
Run Code Online (Sandbox Code Playgroud)
???
我感到困惑有关async- await是你不认为在partioning程序进入独立的任务而言A,B,C,...; 相反,你会想到"这个任务"和"其他一切"而你正在做的就是说"当这个任务运行时,其他一切都可以继续运行".
请帮我理解.
编译器会发现(A)和(B)可以并行运行吗?
不会.编译器不会为您自动并行化任何内容.
如果是这样,是异步 - 等待我如何更改此执行?
不行.async-await与它没有任何关系.
您的代码可以是顺序的,无论它是否同步.无论它是否异步,它都可以是并行的.
例如,同步和并行:
var task1 = Task.Run(() => WriteFooToTextFile());
var task2 = Task.Run(() => WriteBarToTextFile());
Task.WaitAll(task1, task2);
Run Code Online (Sandbox Code Playgroud)
异步和顺序:
await WriteFooToTextFileAsync();
await WriteBarToTextFileAsync();
Run Code Online (Sandbox Code Playgroud)
通过使您的操作真正异步,您可以释放线程并允许它们在应用程序的其他部分上工作.但是,如果没有其他部分,他们坐在那里等待ThreadPool你并没有获得太多.