私は入力テキストの暗号化と復号化を行うWPFプロジェクトを作成するプロジェクトを学校で持っています。私は、アプリケーションが応答したいが、それは常にフリーズします。C#synchronize wpf
私はTPLを使用したいと思いますし、TaskScheduler.FromCurrentSynchronizationContext()を使用していますが、動作しません。私はDispatcherや何か他のものをWPFだけに固有のものにしたくありません。
tokenSource = new CancellationTokenSource();
int lineCount = textBoxInput.LineCount;
string encryptTextInput = "";
List<string> listText = new List<string>();
List<Task> listTask = new List<Task>();
var ui = TaskScheduler.FromCurrentSynchronizationContext();
for (int cnt = 0; cnt < lineCount; cnt++)
{
encryptTextInput = textBoxInput.GetLineText(cnt);
listText.Add(encryptTextInput);
}
for (int cnt = 0; cnt < lineCount; cnt++)
{
int line = cnt;
var myTask = Task.Factory.StartNew(result =>
{
return EncryptDecrypt.Encrypt(listText[line]);
}, tokenSource.Token);
listTask.Add(myTask);
var display = myTask.ContinueWith(resultTask =>
textBoxOutput.Text += myTask.Result.ToString(), CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, ui);
var displayCancel = myTask.ContinueWith(resultTask =>
textBoxOutput.Text += myTask.Result.ToString(), CancellationToken.None, TaskContinuationOptions.OnlyOnCanceled, ui);
}
暗号化機能がアプリケーションをフリーズしている場合は、[マルチスレッド](https://www.tutorialspoint.com/csharp/csharp_multithreading.htm)を使用して同時にUIアップデートを実行する必要があります。 –
アプリケーションを「応答性」にするには、まず2つのループを連続して実行する必要がありません。あなたの弦の使用率を半分にすることが他にないなら、確かに役に立ちます。第二に、暗号化がインラインであるため、TPLを使用しようと思っているかもしれません。キス - それをシンプルに、愚かに保ちなさい。最初にストレート暗号化を行ってから、マルチスレッドを考慮する必要がある場合を参照してください。 –