c#非UI线程获取数据,后创建一个UI线程,在UI控件上显示非UI线程获取的信息,要使得UI线程一直存储且不卡顿
时间: 2024-09-07 10:05:56 浏览: 57
在C#中,如果你需要在非用户界面(Non-UI)线程上获取数据,然后在用户界面线程(UI thread)更新UI控件,通常会使用`BackgroundWorker`、`Task` 或 `async/await` 结合 `Dispatcher` 来确保线程安全并避免UI冻结。以下是基本步骤:
1. 使用 `BackgroundWorker`:
```csharp
private BackgroundWorker backgroundWorker = new BackgroundWorker();
...
backgroundWorker.DoWork += (sender, e) => {
// 在这里获取数据
var data = GetDataFromNonUI();
lock (this) { // 防止直接修改UI控件
Invoke(new Action(() => {
YourControl.Text = data.ToString(); // 更新UI控件
}));
}
};
backgroundWorker.RunWorkerAsync();
```
2. 使用 `Task` 和 `await`:
```csharp
private async void FetchDataButton_Click(object sender, EventArgs e)
{
var data = await Task.Run(() => GetDataFromNonUI());
await Dispatcher.InvokeAsync(() => {
YourControl.Text = data.ToString();
});
}
```
3. `async/await` 结合 `Dispatcher`:
```csharp
private async void FetchDataButton_Click(object sender, EventArgs e)
{
var data = await Task.Run(() => GetDataFromNonUI());
await YourControl.Dispatcher.InvokeAsync(() => {
YourControl.Text = data.ToString();
});
}
```
以上代码中,关键点在于使用 `Invoke` 或 `Dispatcher.InvokeAsync` 将UI操作移动到UI线程执行,这样可以保证UI不会因长时间的数据处理而变得无响应。
阅读全文
相关推荐

















