第64章同時シリーズ(非同期プログラミングB)章III

序文

第二章では、主に、第二章の実施例の節の最後の書き込みに基づいています。
次の例を考えてみて、それを感じます。

レポートの進捗状況

各更新は、プログレスバーを見ることができるときかどうか、我々は、任意のアプリを終了しました。

そして、我々はそのUIインターフェイスのアップデート、および一般的な更新を知って非同期であるが、UI進行状況の更新を通知しなければなりません。

コード:

public class Program
{
	static double percentComplete = 0;
	static void Main(string[] args)
	{
		doit();
		Console.ReadKey();
	}

   public static void DoLoop()
	{
		Task.Run(() =>
		{
			for (var i = 1; i <= 100000; i++)
			{
				setPercent(i/1000);
				Console.WriteLine(i);
			}
			setPercent(101);
		});
	}

	public async static void doit()
	{
		var pregress = CallProcessTask();
		var task=MyMethodAsync(pregress);
		DoLoop();
		await task;
	   
	}

	public static void setPercent(int percent)
	{
		percentComplete = percent;
	}

	public static Progress<double> CallProcessTask()
	{
		var progress = new Progress<double>();
		progress.ProgressChanged += (sender, args) =>
		 {
			 //在这里做一些进度变化,显示在ui上。
			 Console.WriteLine("process:"+args);
		 };
		return progress;
	}

	public static Task MyMethodAsync(IProgress<double> progress=null)
	{
		  var task= Task.Run(() =>
		 {
			 while (percentComplete <= 100)
			 {
				 if (progress != null)
				 {
					 Console.WriteLine("查看进度:" + percentComplete);
					 progress.Report(percentComplete);
				 }
			 }
		 });
		return task;
	}
}

私は上記の、非同期イベント--DoLoopをしたいです。

使用非同期および待機するような月の初心者は、非同期を考えないと非同期イベントを待っていませんでした。

現在の非同期イベントの完了を待つにおける非同期とのawait嘘の役割は何の需要が存在しない場合は、なぜあなたはそれを書いた、あり?

MyMethodAsyncは、現在の進行状況を監視行う別の非同期イベントです。

CallProcessTaskは、進捗状況を構築することである、と手数料を書いた、変更はpercentCompleteを監視します。

完全に一連のタスクを待っています

static void Main(string[] args)
{
	int[] result = DoAll().Result;
	Console.ReadKey();
}

public static async Task<int[]> DoAll()
{
	Task<int> task1 = Task.FromResult(1);
	Task<int> task2 = Task.FromResult(2);
	Task<int> task3 = Task.FromResult(3);
	int[] result=await Task.WhenAll<int>(task1, task2, task3);
	return result;
}

WhenAllグループタスクを管理するために、新しいタスクです。グループタスク、タスクの全ての終わり、タスク終了の進行状況を監視します。

使用して、時間を待っていますが、そこwhenall管理タスクがあると、彼女はより多くのタスクが失敗していたときに、その後、唯一のエラーを報告します。

使用はwhenall、我々のニーズは失敗したが、その後も失敗がなければならない場合、すべてで成功するためにあります。だから私たちはただのミスを傍受システムがそうするで、正しいです。

ここでは、コードの傍受は、次のとおりです。

public static async Task<int[]> DoAll()
{
	Task<int> task1 = Task.FromResult(1);
	Task<int> task2 = Task.FromResult(2);
	Task<int> task3 = Task.FromResult(3);

	Task<int[]> Alltasks = Task.WhenAll<int>(task1, task2, task3);
	try
	{
	   var result=await Alltasks;
		return result;
	}
	catch
	{
		AggregateException allException = Alltasks.Exception;
		// 处理错误
	}
	return null;
}

任意のタスクの完了を待ちます

なぜ、このようなAの需要はありますか?おそらく、あなたは、私たちがアクセスwww.baidu.comことはありませんが、例えば、私たちが百度を訪問し、私たちが訪問するたびに、URLにあると感じています。

しかし、その後、いくつかの事業者のサービスプロバイダは、同じビジネスを行うために、ある要求の異なる領域での安定性を確保するために、無料ですが、同社は安全で、一緒に呼び出します。

static void Main(string[] args)
{
	var result = DoAny('www.baidu.com','www.baidu.com').Result;
	Console.ReadKey();
}


public static async Task<byte[]> DoAny(string urlA,string urlB)
{
	var httpClient = new HttpClient();
	Task<Byte[]> DownLoadTaskA = httpClient.GetByteArrayAsync(urlA);
	Task<Byte[]> DownLoadTaskB = httpClient.GetByteArrayAsync(urlB);
	var completedTask =await Task.WhenAny<byte[]>(DownLoadTaskA, DownLoadTaskB);
	return await completedTask;
}

2つのawaitがあるなぜここに懸念があります。

var completedTask =await Task.WhenAny<byte[]>(DownLoadTaskA, DownLoadTaskB);

return await completedTask;

タスクWhenAnyの作成は非同期であり、かつのでタスクwhenAllの作成が同期されます。

これは、タスクが完了したときwhenAny、それがタスクに戻りますことは注目に値します。他のタスクはまだ良い仕事を中断することで、またはより良い直接彼は完了まで実行できるようにあなたが考慮する必要があり、実行しています。これは、考慮すべき場所です。

タスクは、治療を完了した後

例えば、3つのタスクがあり、私はすぐに次のいずれかへのタスクを完了するタスクの完了後にそのフォローアップを完了しました。

私は言葉を書いた場合:

static void Main(string[] args)
{
	ProcessTasksAsyns();
	Console.ReadKey();
}

public static async Task ProcessTasksAsyns()
{
	Task<int> TaskA = DelayAndReturnAsync(2);
	Task<int> TaskB = DelayAndReturnAsync(3);
	Task<int> TaskC = DelayAndReturnAsync(1);
	Task<int>[] tasks = new[] { TaskA, TaskB, TaskC };
	foreach (var task in tasks)
	{
		var result = await task;
		Console.WriteLine("后续执行:"+result);
	}
}

static async Task<int> DelayAndReturnAsync(int val)
{
	await Task.Delay(TimeSpan.FromSeconds(val));
	Console.WriteLine(val);
	return val;
}

しかし、GETは、このような結果です。

注文が完了タスク1、2、3秒であることをこの結果は示しています。

しかし、フォローアップのための実装は、それが2,3,1で、注文のawaitです。

溶液を3つのタスクを実行するために、他の3つのタスクに入れたれます。

static void Main(string[] args)
{
	ProcessTasksAsyns();
	Console.ReadKey();
}

public static async Task ProcessTasksAsyns()
{
	Task<int> TaskA = DelayAndReturnAsync(2);
	Task<int> TaskB = DelayAndReturnAsync(3);
	Task<int> TaskC = DelayAndReturnAsync(1);
	Task<int>[] tasks = new[] { TaskA, TaskB, TaskC };
	var processingTasks = tasks.Select(async t =>
	{
		var result = await t;
		Trace.WriteLine(result);
	});
	await Task.WhenAll(processingTasks);
}

static async Task<int> DelayAndReturnAsync(int val)
{
	await Task.Delay(TimeSpan.FromSeconds(val));
	Console.WriteLine(val);
	return val;
}

この要求を実現するためにあればもちろん、後に、他の方法を紹介しますが、この説明されます。

未完

この章の例の最後のいくつかの例があります。

おすすめ

転載: www.cnblogs.com/aoximin/p/12661476.html