【发布时间】:2018-11-23 03:54:41
【问题描述】:
我是 Async 和 Await 的新手,我创建了一个简单的项目来了解它的工作原理。 为此,我有一个简单的 Windows 窗体应用程序,它有 2 个元素:
- 获取已完成的项目按钮
- 显示检索到的所有已完成项目的文本框
当我单击按钮时,它应该在 TextBox 中显示所有已完成的项目。 这是我写的代码:
private async void btnGetCompletedItems_Click(object sender, EventArgs e)
{
QueueSystem queueSystem = QueueSystem.NewInstance(75);
Stopwatch watch = new Stopwatch();
watch.Start();
await Task.Run(() => GetCompletedItems(queueSystem));
watch.Stop();
lblTime.Text = $"{watch.ElapsedMilliseconds.ToString()} ms";
}
private void GetCompletedItems(QueueSystem queueSystem)
{
foreach (var item in queueSystem.GetCompletedItems())
{
txtItems.Text += $"{txtItems.Text}{item.ItemKey}{Environment.NewLine}";
}
}
但是,我在
中遇到错误txtItems.Text += $"{txtItems.Text}{item.ItemKey}{Environment.NewLine}";
错误提示
附加信息:跨线程操作无效:控制 'txtItems' 从创建它的线程以外的线程访问 开。
我检查了 Debug 并为 GetCompletedItems() 创建了一个新线程。当我读到 Async 和 Await 时,我读到它不一定会创建一个新线程,但它似乎出于某种原因创建了一个新线程。
我对 Async 和 Await 的实现和理解错了吗? 是否可以在 Windows 窗体应用程序中使用 Async 和 Await?
【问题讨论】:
-
Task.Run涉及其他线程,没有过多详细说明哪些线程以及原因。
标签: c# multithreading winforms asynchronous async-await