2016-11-10 3 views
-1

Ich entwickle eine WPF-App mit C# und .NET Framework 4.6.1 und SQL Server 2012 SP3 und Entity Framework 6.1.3 Code zuerst.Einen neuen Thread sofort ausführen

Ich brauche einen Thread sofort laufen, aber jetzt ist es nicht unmittelbar mit diesem Code ausführen:

Task.Run(() => 
{ 
    RequestNewCodes(); 
}); 
private void RequestNewCodes() 
{ 
    log.DebugFormat("Task thread ID: {0} - {1}", Thread.CurrentThread.ManagedThreadId, DateTime.UtcNow.ToString("hh:mm:ss.fff")); 

    try 
    { 
     trazabilidad.InsertNewCodesWeb(1, codesManagerURL); 
    } 
    catch (Exception ex) 
    { 
     log.Error(string.Format("InsertNewCodesWeb nivel 1: {0}", ex.ToString())); 
    } 
} 

Task.Run Dokumentation sagte:

Queues die angegebene Arbeit auf dem Thread-Pool laufen und gibt ein Task Objekt zurück, das diese Arbeit darstellt.

Aber ich möchte nicht Schlange stehen.

Wie kann ich einen Thread sofort ohne ThreadPool ausführen?

Unmittelbar bedeutet, die Aufgabe in einem Pool nicht zu verschieben und abzuwarten.

Ich verwende keine Verbindungen erneut. Jedes Mal, wenn ich mich mit der Datenbank verbinde, erstelle ich einen neuen DbContext und zerstöre ihn am Ende.

Dies ist keine doppelte Frage. Ich habe alle Antworten auf diese Frage getestet und es funktioniert nicht für mich. Ich habe gefunden, wie man dieses Problem löst, und ich möchte mit Ihnen teilen, aber ich kann nicht, weil diese Frage geschlossen ist.

+0

Durch einen Faden. Aufgaben sind keine Threads. 'neuer Thread(). Start()'. –

+1

Wahrscheinlich läuft es sofort. Wenn nicht, ist Ihr Thread-Pool überlastet. Wie haben Sie festgestellt, wie lange es dauert, bis dieser Code ausgeführt wird? – usr

+0

@usr Weil dieser Code eine Methode ist, die 21 Mal aufgerufen wird. Dieser Code fügt Daten in die Datenbank mit einem Datum ein und ich habe überprüft, dass die Daten 21 Mal eingefügt wurden (es gibt 21 Zeilen in der Datenbank), nachdem alle anderen Prozesse beendet wurden. – VansFannel

Antwort

2

Der einfachste Weg ist nur ein Thread zu instanziiert

Thread task = new Thread(()=> 
{ 
    try 
    { 
     ConnectToCodeManager(); 

     string connectionString = ConfigurationManager.ConnectionStrings["DataBaseConnection"].ConnectionString; 

     SQLTrazabilidadStorage storage = new SQLTrazabilidadStorage(connectionString); 

     storage.SendAggregation(parentCode, codesManagerURL); 
    } 
    catch (Exception ex) 
    { 
     log.Error(string.Format("SendAggregation to TrzCodesManagerWS: {0}", ex.ToString())); 
    } 
}); 
task.Start(); 
+2

Es ist nichts falsch mit dem ThreadPool. Das Starten eines Raw-Threads wird keine Parallelitätsprobleme im Datenzugriffscode –

+0

beheben, aber es ist ein einfacher Weg, mehr Kontrolle darüber zu bekommen, wie und wann es läuft. Momentan ist es nicht möglich zu sagen, ob es ein Nebenläufigkeitsproblem ist, das er beschreibt oder VansFannel will nur die Aktion steuern. –

+1

Nein, Sie bekommen noch mehr Verzögerung - Sie müssen * den * Thread erstellen, der viel Zeit in Anspruch nimmt. Der ThreadPool enthält sofort verwendbare Threads, die sofort verwendet werden können. Ein ThreadPool kann Tausende von Threads enthalten. Wenn Sie also wirklich eine sofortige Antwort wünschen, legen Sie einfach ein minimales Limit fest. –

Verwandte Themen