WPF中的多进程(Threading)处理实例(一)

简介: 原文:WPF中的多进程(Threading)处理实例(一)说明:希望通过揣摩这些案例,能进一步了解进程的工作原理。 1.方法一描述的是在同一窗口中,在计算素数的同时而不影响Canvas的工作。 方法1 1 #region Long-Running Calculat...
原文: WPF中的多进程(Threading)处理实例(一)

说明:希望通过揣摩这些案例,能进一步了解进程的工作原理。

1.方法一描述的是在同一窗口中,在计算素数的同时而不影响Canvas的工作。

方法1
 1         #region Long-Running Calculation in UI Thread
 2 
 3         public delegate void NextPrimeDelegate();
 4         private long num = 3;
 5         private bool continueCalculating = false;
 6         private bool fNotAPrime = false;
 7 
 8         private void btnPrimeNumber_Click(object sender, RoutedEventArgs e)
 9         {
10             if (continueCalculating)
11             {
12                 continueCalculating = false;
13                 btnPrimeNumber.Content = "Resume";
14             }
15             else
16             {
17                 continueCalculating = true;
18                 btnPrimeNumber.Content = "Stop";
19 
20                 //获取与此 System.Windows.Threading.DispatcherObject 关联的 System.Windows.Threading.Dispatcher
21 
22                 //public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method);
23                 //按指定的优先级在与 System.Windows.Threading.Dispatcher 关联的线程上异步执行指定的委托。
24                 btnPrimeNumber.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new NextPrimeDelegate(CheckNextNumber));
25 
26             }
27         }
28 
29         public void CheckNextNumber()
30         {
31             // Reset flag.
32             fNotAPrime = false;
33 
34             for (long i = 3; i <= Math.Sqrt(num); i++)
35             {
36                 if (num % i == 0)
37                 {
38                     // Set not-a-prime flag to true.
39                     fNotAPrime = true;
40                     break;
41                 }
42             }
43 
44             // If a prime number.
45             if (!fNotAPrime)
46             {
47                 tbPrime.Text = num.ToString();
48             }
49 
50             num += 2;
51 
52             if (continueCalculating)
53             {
54                 //3.In the CheckNextNumber function, because the first parameter
55                 //passed into BeginInvoke is DispatcherPriority.SystemIdle(在系统空闲时处理操作。), 
56                 //all of the CheckNextNumber workitem will not break the UI operation.
57 
58                 btnPrimeNumber.Dispatcher.BeginInvoke(
59                     System.Windows.Threading.DispatcherPriority.SystemIdle,
60                     new NextPrimeDelegate(this.CheckNextNumber));
61             }
62         }
63 
64         #endregion

 

方法2
 1   #region Blocking Operation in Worker Thread
 2 
 3         private delegate void NoArgDelegate();
 4         private delegate void OneArgDelegate(Int32[] arg);
 5 
 6         //1.When the Retrieve Data from Server button is clicked, the click handle retrieveData function is called.
 7         private void btnRetrieveData_Click(object sender, RoutedEventArgs e)
 8         {
 9             this.btnRetrieveData.IsEnabled = false;
10             this.btnRetrieveData.Content = "Contacting Server";
11 
12             NoArgDelegate fetcher = new NoArgDelegate(this.RetrieveDataFromServer);
13 
14             //2.Then our codes use delegate.BeginInvoke to start a thread from the thread pool.
15             //This thread is used to perform the long operation of retrieving data.
16             fetcher.BeginInvoke(null, null);
17         }
18 
19         /// <summary>
20         /// Retrieve data in a worker thread(辅助线程).
21         /// </summary>
22         private void RetrieveDataFromServer()
23         {
24             //3.We use Thread.Sleep(5000) to simulate(模拟) a 5 seconds delay here.
25             // Simulate the delay from network access.
26             Thread.Sleep(5000);
27 
28             //4.The codes generate 4 random numbers as data and update them to the UI by calling the Dispatcher.BeginInvoke().
29 
30             // Generate random data to be displayed.
31             Random rand = new Random();
32             Int32[] data = {
33                                rand.Next(1000), rand.Next(1000), 
34                                rand.Next(1000), rand.Next(1000) 
35                            };
36 
37             // Schedule the update function in the UI thread.
38             this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
39                 new OneArgDelegate(UpdateUserInterface),  data);
40               
41         }
42 
43         /// <summary>
44         /// Update the UI about the new data. The function runs in the UI thread.
45         /// </summary>
46         /// <param name="data"></param>
47         private void UpdateUserInterface(Int32[] data)
48         {
49             this.btnRetrieveData.IsEnabled = true;
50             this.btnRetrieveData.Content = "Retrieve Data from Server";
51             this.tbData1.Text = data[0].ToString();
52             this.tbData2.Text = data[1].ToString();
53             this.tbData3.Text = data[2].ToString();
54             this.tbData4.Text = data[3].ToString();
55         }
56 
57         #endregion



目录
相关文章
|
1月前
|
PHP
PHP的pcntl多进程用法实例
PHP使用PCNTL系列的函数也能做到多进程处理一个事务。
34 12
|
4月前
|
C# UED 开发者
WPF与性能优化:掌握这些核心技巧,让你的应用从卡顿到丝滑,彻底告别延迟,实现响应速度质的飞跃——从布局到动画全面剖析与实例演示
【8月更文挑战第31天】本文通过对比优化前后的方法,详细探讨了提升WPF应用响应速度的策略。文章首先分析了常见的性能瓶颈,如复杂的XAML布局、耗时的事件处理、不当的数据绑定及繁重的动画效果。接着,通过具体示例展示了如何简化XAML结构、使用后台线程处理事件、调整数据绑定设置以及利用DirectX优化动画,从而有效提升应用性能。通过这些优化措施,WPF应用将更加流畅,用户体验也将得到显著改善。
305 1
|
6月前
|
Unix Shell Perl
技术心得:实例解析shell子进程(subshell)
技术心得:实例解析shell子进程(subshell)
|
调度 Python
并发编程实践:进程、线程和threading 模块的全面解析
并发编程实践:进程、线程和threading 模块的全面解析
webpack优化篇(四十三):多进程/多实例构建:资源并行解析可选方案
webpack优化篇(四十三):多进程/多实例构建:资源并行解析可选方案
157 0
webpack优化篇(四十三):多进程/多实例构建:资源并行解析可选方案
|
Shell Linux
shell脚本多进程并发写法实例(高阶修炼)
shell脚本多进程并发写法实例(高阶修炼)
WPF界面异常:未将对象引用设置到对象实例
WPF界面异常:未将对象引用设置到对象实例
|
缓存 监控 NoSQL
Python编程:supervisor模块管理进程实例
Python编程:supervisor模块管理进程实例
866 0
Python编程:supervisor模块管理进程实例
|
C++ Windows
windows启动单个进程实例(系统中只有一个运行实例)
windows启动单个进程实例(系统中只有一个运行实例)
243 0
windows启动单个进程实例(系统中只有一个运行实例)
|
Linux
Linux系统查询指定路径下的进程,根据进程id号杀进程方法,进程卡死解决方法实例演示
Linux系统查询指定路径下的进程,根据进程id号杀进程方法,进程卡死解决方法实例演示
237 0
Linux系统查询指定路径下的进程,根据进程id号杀进程方法,进程卡死解决方法实例演示