2017-02-06 2 views
0

Ich schrieb ein Visual Studio 2015 C# -Programm zum Lesen von einem benutzerdefinierten Ethernet-Gerät einige Daten. Ich muss Async-Anweisungen verwenden, da die Daten alle zu geplanten Zeiten gelesen werden.C# async erwarten und Ausnahme

Ich benutze eine benutzerdefinierte .NET-Bibliothek zum Lesen von Daten; dies ist mein Code:

private void timerPollingData_Tick(object sender, EventArgs e) 
{ 
    readDevice_01(); 
    readDevice_02(); 
    // and so on for all devices ... 
} 

private async void readDevice_01() 
{ 
    var result = await getDataDevice_01(); 
    // Save data 
} 

private async void readDevice_02() 
{ 
    var result = await getDataDevice_02(); 
    // Save data 
} 

private Task<string> getDataDevice_01() 
{ 
    MyCustomLibrary readDevice = new MyCustomLibrary.Master(); 
    return Task.Factory.StartNew(() => readDevice.ReadHoldingRegister(... some parameters ...).ToString());      
} 

private Task<string> getDataDevice_02() 
{ 
    MyCustomLibrary readDevice = new MyCustomLibrary.Master(); 
    return Task.Factory.StartNew(() => readDevice.ReadHoldingRegister(... some parameters ...).ToString());      
} 

Meine Zweifel: was ist die beste Praxis für Griff Ausnahme der einzelnen Aufgaben? Ich muss verstehen, welche Geräte vom Ethernet getrennt werden oder ausschalten und dann den TASK STOPPEN, der verwendet wird, um Daten von ihm abzurufen.

Vielen Dank im Voraus für Ihre Hilfe.

+5

* Verwenden Sie 'async void' NICHT, es ist nur für Event-Handler. Sie können es nicht abwarten oder Ausnahmen abfangen. Verwenden Sie 'async Task ', wenn Sie nichts zurückgeben möchten. –

+0

@ PanagiotisKanavos - Gute Standard-Ratschläge, aber der TimerTick _ist_ ein Eventhandler. Die Verbreitung in zwei Async-Void-Methoden ist also nicht großartig, aber auch nicht völlig falsch. –

+0

Wir müssen nicht wissen, welches Visual Studio, aber sagen Sie uns, ob dies ein Windows-Dienst oder WinForms oder ... Anwendung ist. –

Antwort

0

Sie sollten vermeiden async void; Verwenden Sie async Task für alles außer asynchronen Ereignishandlern. Weitere Informationen finden Sie in meinem Artikel unter async best practices.

Auch sollten Sie nicht verwenden StartNew; Es handelt sich um eine sehr gefährliche API mit ungeeigneten Standardparameterwerten. Verwenden Sie Task.Run anstelle von StartNew. Weitere Informationen finden Sie in meinem Blogbeitrag unter StartNew is dangerous.

Ich brauche async erwarten Anweisungen, weil die Daten alle zusammen zu geplanten Zeiten gelesen werden.

Asynchronität eine Form der Gleichzeitigkeit ist, die Sie mit Task.Runwenn Ihr Gerät API nicht über asynchrone Methoden verwenden:

private async void timerPollingData_Tick(object sender, EventArgs e) 
{ 
    var task1 = readDevice_01(); 
    var task2 = readDevice_02(); 
    // and so on for all devices ... 
    await Task.WhenAll(task1, task2, ...); 
} 

private async Task readDevice_01() 
{ 
    var result = await Task.Run(() => getDataDevice_01()); 
    // Save data 
} 

private string getDataDevice_01() 
{ 
    MyCustomLibrary readDevice = new MyCustomLibrary.Master(); 
    return readDevice.ReadHoldingRegister(... some parameters ...).ToString();      
} 

Wenn Ihr API eine ReadHoldingRegisterAsync Methode hatte, dann wäre dies mehr natürlich wie folgt ausgedrückt:

private async void timerPollingData_Tick(object sender, EventArgs e) 
{ 
    var task1 = readDevice_01Async(); 
    var task2 = readDevice_02Async(); 
    // and so on for all devices ... 
    await Task.WhenAll(task1, task2, ...); 
} 

private async Task readDevice_01Async() 
{ 
    var result = await getDataDevice_01Async(); 
    // Save data 
} 

private async Task<string> getDataDevice_01Async() 
{ 
    MyCustomLibrary readDevice = new MyCustomLibrary.Master(); 
    var result = await readDevice.ReadHoldingRegisterAsync(... some parameters ...); 
    return result.ToString(); 
} 

Meine Zweifel: was das ist Best Practice für Handle-Ausnahme jeder Aufgabe? Ich muss verstehen, welche Geräte vom Ethernet getrennt werden oder ausschalten und dann den TASK STOPPEN, der verwendet wird, um Daten von ihm abzurufen.

Die besten Verfahren zum Abrufen von Ausnahmen von Aufgaben sind await ihnen.

Sie müssen sich keine Sorgen darüber machen, eine Aufgabe anzuhalten, nachdem eine Ausnahme ausgelöst wurde. Zu dem Zeitpunkt, zu dem die Aufgabe ihre Ausnahme meldet, wurde sie bereits gestoppt.

+0

Hallo Stephen, vielen Dank für Beispielcode; Ich weiß nicht, ob meine benutzerdefinierte Bibliothek (oder API) asynchrone Methoden zum Lesen von Daten hat oder nicht.Also, für den Moment versuche ich, meinen Code zu modifizieren, um das erste Codebeispiel zu erstellen. Nächste Woche hoffe ich, einen Test zu machen; dann aktualisieren Sie diese Diskussion mit meinen Ergebnissen vielen Dank – jumpier