2012-12-19 4 views
12

Ich habe zum Lesen Eingang Neue Nachrichten mithilfe Exchange Server wie below.How hinzuzufügen diese IEnumerable Sammlung in eine Warteschlange und Verarbeiten jede Liste von Punkt innerhalb der Warteschlange ein Verfahren geschaffen?Wie fügt man eine IEumerable Collection zu einer Queue hinzu und verarbeitet jedes Element asynchron in .NET? asynchron

private static IEnumerable<ExchangeEmailInformation> GetInboxItems(ExchangeService service) 
{ 
    var emailInformations = new List<ExchangeEmailInformation>(); 
    try 
    {  
     SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false)); 
     var itemview = new ItemView(int.MaxValue); 
     FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, searchFilter, itemview); 
     Console.WriteLine("\n-------------Result found:-------------"); 
     service.LoadPropertiesForItems(findResults, PropertySet.FirstClassProperties); 

     foreach (var item in findResults) 
     { 
      emailInformations.Add(new ExchangeEmailInformation 
      { 
       Attachment = item.Attachments ?? null, 
       Body = item.Body.BodyType == BodyType.HTML ? ConvertHtml.ToText(item.Body.Text) : item.Body.Text, 
       Subject = item.Subject, 
       RecievedDate = item.DateTimeReceived 
      }); 
     } 
    } 
    catch (Exception ee) 
    { 
     Console.WriteLine("\n-------------Error occured:-------------"); 
     Console.WriteLine(ee.Message.ToString()); 
     Console.WriteLine(ee.InnerException.ToString()); 
     Console.ReadKey(); 
    } 
    return emailInformations; 
} 

Die unten sind die Verfahren i unter Verwendung jedes Elemente in der Warteschlange können

static void AddAttachment(string subject ,string docId, string user, string fileName) 
{ 
    var url = new StringBuilder(); 
    url.Append(string.Format("https://webdemo-t.test.com:8443/Services/Service/MyService.svc/AddAttachment?User={0}&Engagement={1}&FileName={2}&DocumentTrasferID={3}", user, subject, fileName, docId)); 

    Console.WriteLine(url.ToString()); 
    WebRequest request = WebRequest.Create(url.ToString()); 
    var credential = new NetworkCredential("user", "xxxx", "xxxx"); 
    request.Credentials = credential; 
    WebResponse ws = request.GetResponse(); 
    Encoding enc = System.Text.Encoding.GetEncoding(1252); 
    var responseStream = new StreamReader(ws.GetResponseStream()); 
    string response = responseStream.ReadToEnd(); 
    responseStream.Close(); 
    Console.WriteLine(response); 
} 

Antwort

1

Sie neue Aufgabe asynchron aufrufen müssen für jede Befestigung starten. Du musst nicht über die Anzahl der Aufgaben nachdenken, die du spawnt. Aufgaben werden nicht den Threads 1 bis 1 zugeordnet.

foreach (var item in findResults) 
{ 
    emailInformations.Add(new ExchangeEmailInformation ...); 

    // start new task 
    Task.Factory.Start(() => { 
     AddAttachment(item.Subject, item.docId, item.User ...); 
    }) 
} 

Für diese Methode müssen Sie keine asynchrone API verwenden.

Eine andere Möglichkeit ist asynchrone API der WebRequest/WebResponse Klassen zu verwenden.

+0

Ich mag jedes Einzelteil in einer Warteschlange verarbeiten asynchronosly – JEMI

+0

als Sie Ihre Frage verbessern müssen. Welche Schritte Ihres Algorithmus müssen asynchron ausgeführt werden? – Lazin

+0

Ich habe die Frage aktualisiert, indem das Verfahren das Hinzufügen i asynchron ausgeführt werden müssen – JEMI

2

Wenn .NET 4.0 oder smth, haben Sie versucht, AsParallel Methode Erweiterung?

+1

+1 PLINQ Ihnen dabei helfen können. http://msdn.microsoft.com/en-us/library/dd997425.aspx –

+0

Ich brauche jede Liste der Artikel in der Warteschlange zu verarbeiten – JEMI

+0

immer noch, warum con't Sie wie folgt tun: foreach (var Artikel in findResults. AsParallel()) {...} – vyakhir

Verwandte Themen