我有一个项目在学校做一个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 - 保持简单,愚蠢。先做直接加密,然后看看是否需要考虑多线程。 –