Ich versuche, eine große Textdatei in eine TextBox zu lesen und halten Sie die UI reagieren, wenn eine Datei in das Textfeld gezogen wird.Behalten Sie UI-Thread reagieren, wenn lange Task in Windows-Formularen ausgeführt wird
Nicht funktioniert wie erwartet, die Windows-Formulare ist eingefroren und scheint nur die Aufgabe zu arbeiten, die Datei zu lesen und den Inhalt an die Textbox anzufügen.
Ein ContextSwitchDeadLock wurde von der IDE geworfen, aber nicht wirklich ein Fehler. Dies ist eine lange laufende Aufgabe. Ich habe es behoben, das Verhalten im Ausnahmemenü zu ändern.
Dank Jsteward hat Peter den Code geändert.
Wie kann ich die UI (Haupt-Thread) reagieren, wenn diese Aufgabe ausgeführt wird? Danke.
private SynchronizationContext fcontext;
public Form1()
{
InitializeComponent();
values.DragDrop += values_DragDrop; //<----------- This is a textbox
fcontext = WindowsFormsSynchronizationContext.Current;
}
// The async callback
async void values_DragDrop(object sender, DragEventArgs e)
{
try
{
string dropped = ((string[]) e.Data.GetData(DataFormats.FileDrop))[0];
if (dropped.Contains(".csv") || dropped.Contains(".txt"))
{
using (StreamReader sr = File.OpenText(dropped))
{
string s = String.Empty;
while ((s = await sr.ReadLineAsync()) != null)
{
values.AppendText(s.Replace(";",""));
}
}
}
}
catch (Exception ex) { }
}
Sie könnten einfach '... AppendText (erwarten ... ReadLineAsync)' anstelle der blockierenden Variante der 'File' API. Auf diese Weise müssen Sie nicht manuell in einem Kontext speichern oder posten. – JSteward
@JSteward Tried values.AppendText (erwartet sr .ReadLineAsync()) aber nur warten kann auf einen Lamba-Ausdruck angewendet werden. – ppk
Ich denke, du meinst, es kann nur auf einen ** asynchronen ** Lamda-Ausdruck angewendet werden. Können Sie den Code in der Frage aktualisieren? – JSteward