我有一個項目在學校做一個WPF項目,使加密和解密的輸入文本。我希望應用程序具有響應能力,但始終會凍結。C#同步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。 KISS - 保持簡單,愚蠢。先做直接加密,然後看看是否需要考慮多線程。 –