大きなテキストファイルをTextBoxに読み込み、ファイルがテキストボックスにドラッグされたときに応答するようにしています。Windowsフォームで長いタスクを実行しているときにUIスレッドを応答させ続ける
期待どおりに動作しません。ウィンドウのフォームがフリーズし、ファイルを読み込んでテキストボックスに内容を追加する作業が行われているように見えます。
IDEによってContextSwitchDeadLockがスローされましたが、実際にはエラーではありません。 これは長時間実行されるタスクです。例外メニューの下で動作を変更するように修正しました。
JStewardのおかげで、Peterはコードをこれに変更しました。
このタスクを実行しているときに私はどのようにしてui(メインスレッド)を応答し続けることができますか?おかげさまで
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) { }
}
'File' APIのブロックバリアントを使うのではなく、' AppendText(待ち受け... ReadLineAsync) 'を使うことができます。そうすれば、手動でコンテキストを保存したりポストする必要がなくなります。 – JSteward
@JSteward試した値.AppendText(await sr.ReadLineAsync())が待ち受けているのは、lamba式にのみ適用できます。 – ppk
** 'async' ** lamda式にしか適用できないと思います。質問のコードを更新できますか? – JSteward