日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

使用线程新建WPF窗体(公用进度条窗体)

發布時間:2025/3/20 asp.net 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用线程新建WPF窗体(公用进度条窗体) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用線程新建窗體

項目中需要一個公用的進度條窗體.大家知道在wpf中,有兩個線程,一個是UI線程,另一個是監聽線程(一直監聽用戶的輸入).如果我們后臺有阻塞UI線程的計算存在,那么界面上的比如進度條什么動態的UI都會被因為阻塞而靜止不動.

所以我的想法就是新起一個線程來負責進度條窗體的顯示與關閉,具體實現代碼如下:

private static Thread th;/// <summary>/// 顯示進度條 線程/// </summary>/// <param name="msg">進度條界面需要顯示的文字</param>/// <param name="sleep">增加進度條存在的延遲時間,單位為毫秒</param>public static void BeginProgressBar(string msg, int sleep){try{if (th == null || th.ThreadState == ThreadState.Aborted){th = new Thread(new ThreadStart(() =>{WinProgressBar win = new WinProgressBar();win.Tips = msg;win.Topmost = true;win.Show();System.Windows.Threading.Dispatcher.Run();}));th.SetApartmentState(ApartmentState.STA);th.IsBackground = true;}if (th.ThreadState != ThreadState.Background || th.ThreadState == ThreadState.Unstarted || th.ThreadState != ThreadState.Running){th.Start();}}catch (Exception){th = new Thread(new ThreadStart(() =>{WinProgressBar win = new WinProgressBar();win.Tips = msg;win.Topmost = true;win.Show();System.Windows.Threading.Dispatcher.Run();}));th.SetApartmentState(ApartmentState.STA);th.IsBackground = true;th.Start();}Thread.Sleep(sleep);}/// <summary>/// 結束進度條/// </summary>public static void EndProgressBar(){if (th.IsAlive)th.Abort();}

呵呵,大家仔細分析下代碼看有什么問題沒有?而你們又有什么好的解決方案沒有?

在使用過程中發現一個很嚴重的問題,出現一個進度條窗體,系統內存就會增大一點,到最后要么卡死,要么自動退出.

? ? ?原來在多線程程序運行中,由用戶取消操作是一種非常常見的場景,比如用戶使用windows資源管理器在當前文件夾中搜索文件時,可以通過點擊其它文件夾而取消搜索。
中途停止一個線程的執行,通常用Thread.Abort方法,但這種方式會造成程序涉及的數據完整性受到破壞,線程所占用的一些系統資源(比如文件句柄等)也可能無法完成。比較合理的方式是外界提出"取消操作"的請求,然后由線程自身來決定如何處理這一請求。
在設計多線程程序時,可設置一個用于接收外部取消消息的屬性,然后在線程函數中分階段地檢測這一屬性,每個階段的檢查點由軟件開發者確定,并且決定線程如何優雅退出。

所以對上述代碼進行了改進

首先設置一個公共變量:

?public static bool IsClsoeProgeressBar = true;

然后在進度條窗體中實時讀這個數據

/// <summary>/// WinProgressBar.xaml 的交互邏輯/// </summary>public partial class WinProgressBar : Window{public string Tips { get; set; }DispatcherTimer timer;public WinProgressBar(){InitializeComponent();timer = new DispatcherTimer();timer.Interval = TimeSpan.FromMilliseconds(200);timer.Tick += new EventHandler(timer_Tick);timer.IsEnabled = true;this.Topmost = true;//this.Loaded += delegate//{// if (this.Tips != "")// tbTips.Text = this.Tips;//};}void timer_Tick(object sender, EventArgs e){if (Common.CommWindow.IsClsoeProgeressBar){if (this.Visibility == Visibility.Visible){progressBar1.IsIndeterminate = false;this.Hide();}}else{if (this.Visibility != Visibility.Visible){progressBar1.IsIndeterminate = true;this.Show();} }}}
然后在系統加載的時候,創建這個進度條窗體 try{Thread th = new Thread(new ThreadStart(() =>{WinProgressBar win = new WinProgressBar();// win.Tips = msg;win.Show();System.Windows.Threading.Dispatcher.Run();}));th.SetApartmentState(ApartmentState.STA);th.IsBackground = true;th.Start();}catch (Exception){}
我們只需改變公共變量來控制窗體的顯示與隱藏 /// <summary>/// 顯示進度條 線程/// </summary>public static void BeginProgressBar(){IsClsoeProgeressBar = false;}/// <summary>/// 結束進度條/// </summary>public static void EndProgressBar(){//cts.Cancel();IsClsoeProgeressBar = true;}
還有一個比較好的方法: #region Methods/// <summary>/// 一個耗時的任務/// </summary>private void BigTask(){Thread.Sleep(3000);}private void button1_Click(object sender, RoutedEventArgs e){MyProgressBar(BigTask);}private void MyProgressBar(Action mywork){var worker = new BackgroundWorker();var window = new BusyWindow();worker.DoWork += (s, e2) => { mywork(); };worker.RunWorkerCompleted += (s, e2) =>{MessageBox.Show("任務已經完成");window.Close();};worker.RunWorkerAsync();window.Show();}#endregion

轉載于:https://www.cnblogs.com/sjqq/p/6637187.html

總結

以上是生活随笔為你收集整理的使用线程新建WPF窗体(公用进度条窗体)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。