Heim >Backend-Entwicklung >C#.Net-Tutorial >Detaillierte Erläuterung der Verwendung von Async und Wait in C#

Detaillierte Erläuterung der Verwendung von Async und Wait in C#

黄舟
黄舟Original
2017-09-09 15:35:322081Durchsuche

In diesem Artikel wird hauptsächlich die spezifische Verwendung von Async und Wait in C# vorgestellt. Der Herausgeber findet ihn recht gut, daher werde ich ihn jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Editor und werfen wir einen Blick darauf

async und waiting wurden in C# 5.0 eingeführt. Diese beiden Schlüsselwörter erleichtern Ihnen das Schreiben von asynchronem Code.

Sehen Sie sich ein Beispiel an:


public class MyClass 
{ 
  public MyClass() 
  { 
    DisplayValue(); //这里不会阻塞 
    System.Diagnostics.Debug.WriteLine("MyClass() End."); 
  } 
  public Task<double> GetValueAsync(double num1, double num2) 
  { 
    return Task.Run(() => 
    { 
      for (int i = 0; i < 1000000; i++) 
      { 
        num1 = num1 / num2; 
      } 
      return num1; 
    }); 
  } 
  public async void DisplayValue() 
  { 
    double result = await GetValueAsync(1234.5, 1.01);//此处会开新线程处理GetValueAsync任务,然后方法马上返回 
    //这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用 
    System.Diagnostics.Debug.WriteLine("Value is : " + result); 
  } 
}

Oben wird die asynchrone Methode DisplayValue() aufgerufen, die im Konstruktor von mit dem Schlüsselwort async gekennzeichnet ist MyClass. Die Methode DisplayValue() führt eine asynchrone Aufgabe GetValueAsync() aus, die mit dem Schlüsselwort „await“ gekennzeichnet ist. Diese asynchrone Aufgabe muss Task oder Taskb54c2c292509147c0b54128f4eb90887 verwenden Die Ausführung ist abgeschlossen. Der gesamte Code nach „await GetValue()“ in der Methode „DisplayValue()“ wird ausgeführt, wenn die asynchrone Aufgabe abgeschlossen ist.

Der tatsächlich von der DisplayValue()-Methode ausgeführte Code lautet wie folgt:


public void DisplayValue() 
{ 
  System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter(); 
  awaiter.OnCompleted(() => 
    { 
      double result = awaiter.GetResult(); 
      System.Diagnostics.Debug.WriteLine("Value is : " + result); 
    }); 
}

Wie Sie sehen können, ist die Asynchronität und das Warten Schlüsselwörter ersetzen einfach die oben genannten. Der Code wird einfach einfacher und verständlicher.

Die Ausgabe des Programms ist wie folgt:

MyClass() End.
Wert ist: 2.47032822920623E-322

Das Folgende ist eine von mir geschriebene statische Klasse, die den asynchronen Aufruf einer allgemeinen Funktion erleichtern kann:


public static class TaskAsyncHelper 
{ 
  /// <summary> 
  /// 将一个方法function异步运行,在执行完毕时执行回调callback 
  /// </summary> 
  /// <param name="function">异步方法,该方法没有参数,返回类型必须是void</param> 
  /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法没有参数,返回类型必须是void</param> 
  public static async void RunAsync(Action function, Action callback) 
  { 
    Func<System.Threading.Tasks.Task> taskFunc = () => 
    { 
      return System.Threading.Tasks.Task.Run(() => 
      { 
        function(); 
      }); 
    }; 
    await taskFunc(); 
    if (callback != null) 
      callback(); 
  } 
 
  /// <summary> 
  /// 将一个方法function异步运行,在执行完毕时执行回调callback 
  /// </summary> 
  /// <typeparam name="TResult">异步方法的返回类型</typeparam> 
  /// <param name="function">异步方法,该方法没有参数,返回类型必须是TResult</param> 
  /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法参数为TResult,返回类型必须是void</param> 
  public static async void RunAsync<TResult>(Func<TResult> function, Action<TResult> callback) 
  { 
    Func<System.Threading.Tasks.Task<TResult>> taskFunc = ()=> 
      { 
        return System.Threading.Tasks.Task.Run(()=> 
          { 
            return function(); 
          }); 
      }; 
    TResult rlt = await taskFunc(); 
    if(callback != null) 
      callback(rlt); 
  } 
}

Es ist sehr einfach, den Methodennamen als Parameter zu verwenden Am häufigsten wird die zeitaufwändige Serialisierungsfunktion verwendet, um zu vermeiden, dass der UI-Prozess blockiert wird, was zu Verzögerungen führt und die Benutzererfahrung beeinträchtigt.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung von Async und Wait in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn