2017-03-06 7 views
0

J'ai un ensemble de méthodes asynchrones que j'ai écrites pour gérer une grande quantité de données extraites et compilées rapidement. Pour la plupart, cela fonctionne fantastique et a vraiment fait des merveilles pour mon logiciel. Cependant, récemment, j'ai rencontré un petit problème avec les méthodes: De temps à autre, l'utilisateur bousille et les délais que le logiciel tire les données deviennent énormes et l'adaptateur de données expire avant d'obtenir l'information. Normalement, dans une méthode de synchronisation, vous utiliseriez un try/catch pour gérer de tels problèmes, mais j'ai essayé cela en vain. Existe-t-il un moyen de gérer de façon asynchrone les exceptions simplement en les lançant comme une méthode de synchronisation, alors mon catch tout try/catch peut fonctionner correctement?DataAdapter Remplir une exception asynchrone

Voici un exemple de la méthode de l'adaptateur de données async i utilise:

private async Task<DataTable> WWQuery2Run 
(string A, string B, string C, string D) 
{ 
    using (var conn = new System.Data.SqlClient.SqlConnection(ReportResources.ConnString)) 
    { 
    var temp = new DataTable(); 
    var DA = new SqlDataAdapter(string.Format(ReportResources.Instance.CureInfoQueries["WWQuery2"], A, B, C, D), conn); 
    await Task.Run(() => DA.Fill(temp)); 
    return temp; 
    } 
} 

EDIT:

j'ai réalisé après tout la peine d'essayer de gérer les exceptions du délai qu'il est pas une bonne pratique pour travailler de cette façon. Je suis allé de l'avant et ajouté une méthode pour calculer la durée avant d'entrer dans la méthode asynchrone affichée et avertir l'utilisateur de la longueur et leur a donné une option pour annuler la compilation. Avec cela en place, j'ai augmenté le délai d'attente de la requête à un montant qui devrait couvrir tout sauf le pire des pires scénarios pour si l'utilisateur souhaite continuer. J'ai également ajouté à la description sur les éléments dans le programme une durée calculée afin qu'ils sachent que cela a duré longtemps avant d'essayer d'interroger et de compiler.

Merci @Murad Garibzada pour votre aide.

Répondre

0

Vous pouvez augmenter délai d'attente de commande de l'adaptateur comme ci-dessous:

SqlDataAdapter adapter= new SqlDataAdapter(strSQLString, conUS); 
adapter.SelectCommand.CommandTimeout=120; 

exception Manipulation:

private async Task<DataTable> WWQuery2Run 
    (string A, string B, string C, string D) 
    { 
     using (var conn = new System.Data.SqlClient.SqlConnection(ReportResources.ConnString)) 
{ 
var temp = new DataTable(); 
var DA = new SqlDataAdapter(string.Format(ReportResources.Instance.CureInfoQueries["WWQuery2"], A, B, C, D), conn); 


Task task = new Task(() => DA.Fill(temp)); 
try 
{ 
    task.Wait(); 
} 
catch (Exception ae) 
{ 



} 

return temp; 
} 
} 
+0

Cela fonctionne, oui, mais je préférerais qu'il expire et puis alerter l'utilisateur il y a un problème si possible. Je comprends que je demande probablement quelque chose qui n'est pas correct, mais mes utilisateurs sont un peu sombres et supposeront qu'il y a un problème avec le logiciel au lieu d'une erreur de l'opérateur dans le cas où les temps sont trop longs. – ARidder101

+0

Il est très simple, allez sur le lien: https://msdn.microsoft.com/en-us/library/dd537614(v=vs.110).aspx – Murad

+0

Pourriez-vous donner un exemple de la façon dont les méthodes dans ce lien marchera? J'ai essayé plusieurs fois de faire fonctionner cette méthode mais pour moi, il semble que les méthodes dans ce lien ne sont pas pour les méthodes/tâches asynchrones et ne font donc rien pour mon problème. – ARidder101

0

Avec l'augmentation du délai d'attente de commande, vous pouvez utiliser un bloc try/catch. Comme vous attendez, le contrôle ne retournera pas à votre indicatif jusqu'à ce que WWQuery2Run soit terminé. Si WWQuery2Run renvoie SomeException, il sera intercepté et traité par le code.

private async Task<DataTable> WWQuery2Run(string A, string B, string C, string D) 
{ 
    try 
    { 
     using (var conn = new System.Data.SqlClient.SqlConnection(ReportResources.ConnString)) 
     { 
      var temp = new DataTable(); 
      var DA = new SqlDataAdapter(string.Format(ReportResources.Instance.CureInfoQueries["WWQuery2"], A, B, C, D), conn); 
      await Task.Run(() => DA.Fill(temp)); 
      return temp; 
     } 
    } 
    catch (SomeException ex) 
    { 
     // handle exception 
    } 
}