我對執行緒的概念比較陌生,我想在我的應用程式中使用Task,它是Thread的一個組件,因為保存任務需要時間來執行。
這是我的代碼:
這是我的代碼。
private void SaveItem(object sender, RoutedEventArgs e)。
{
//Button Save Click(保存到資料庫)。
Task.Run(() =>
{
var itemsS = GridviewServices.Items;
Dispatcher.Invoke(() =>
{
foreach (ItemsModel item in itemsS)
{
PleaseWaittxt.Visibility = Visibility.Visible。
bool testAdd = new Controller().AddItem(item);
if (testAdd)
Console.WriteLine("Add true to Items")。
else
{
MessageBox.Show("添加失敗")。
return;
}
}
PleaseWaittxt.Visibility = Visibility.Hidden;
});
});
MessageBox.Show("Save Done")。
//update the gridView
var results = new Controller().GetAllItems()。
Gridview.ItemsSource = null;
Gridview.ItemsSource = results;
Gridview.Items.Refresh()。
問題是,當我保存所有專案時,我在資料庫中得到了重復的資料。否則,ItemsS的計數被固定為300,但在保存后,我得到了600,
Task.Run()是否重復了保存任務到資料庫的程序?
NB:我正在做一個UI專案(WPF桌面應用程式)
uj5u.com熱心網友回復:
我想你需要類似這樣的東西。 我很快就把它弄好了,但我希望它足以讓你自己嘗試進行修復。
private async void SaveItem(object sender, RoutedEventArgs e)。
{
try {
var itemsS = GridviewServices.Items.ToList(); // to list makes shallow copy.
await Task.Run(() => {
foreach (ItemsModel item in itemsS)
{
bool testAdd = new Controller().AddItem(item)。
}
});
//不要在task.run中更新ui,因為只有ui執行緒可以訪問UI專案。
//在這里進行更新 - 在await之后。(或使用dispatcher.invoke).
GridviewServices.Items.Clear()。
GridviewServices.Items = itemsS;
} catch { ... } //處理例外,記錄它們或其他。不要扔在async void中! }
}
我還想這樣做:
private async void SaveItem(object sender, RoutedEventArgs e)。
{
/// Button Save Click ( Save to the database )
var itemsS = GridviewServices.Items。
await Task.Run(() =>
{
foreach (ItemsModel item in itemsS)
{
Dispatcher.Invoke(() => {PleaseWaittxt.Visibility = Visibility.Visible;})
bool testAdd = new Controller().AddItem(item) 。
if (testAdd)
Console.WriteLine("Add true to Items")。
else
{
MessageBox.Show("添加失敗")。
return;
}
}
Dispatcher.Invoke(() => {PleaseWaittxt.Visibility = Visibility.Hidden;})
});
MessageBox.Show("Save Done")。
//update the gridView
var results = new Controller().GetAllItems()。
Gridview.ItemsSource = null;
Gridview.ItemsSource = results;
Gridview.Items.Refresh()。
uj5u.com熱心網友回復:
你遇到的問題是,你正在執行的任務并不是并行運行的,而是與你的應用程式的其他部分同步。
當您在 UI 應用程式的后臺運行 CPU 密集型任務時,您將希望使用實際執行緒或異步/等待(async/await),這正是您在代碼中所嘗試的。
你想要做的是類似于這樣的事情:
你想要做的是類似于這樣的事情:
private async void SaveItem(object sender, RoutedEventArgs e) => await 任務。 運行(
/*optionally make this async too*/() => {
//在這里執行你的CPU密集型任務。
Dispatcher.Invoke(() => {
//在這里處理你的UI更新。
});
});
這只是一個總體概述,我不知道你的確切用例,但這應該能讓你在正確的方向上起步。
。在使用 Lambdas 等時,需要注意的一點是閉包。 如果您的應用程式傾向于使用大量的記憶體,您可能需要重新考慮您的呼叫樹的結構,并在您運行的應用程式中盡量減少閉包。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/307898.html
標籤:
