C#网络应用编程,实验4:线程管理练习

简介: 线程管理练习

实验4:线程管理练习

1、通过本实验,熟悉和掌握Thread类、ThreadPool类以及WPF中多线程的使用。
2、复习C#中lambda表达式和委托

1、创建一个WPF应用程序项目

2、将App.xaml中的Application.Resources节内容改为

在这里插入图片描述

3、修改MainWindow.xaml及代码隐藏类

MainWindow.xaml

在这里插入图片描述

MainWindow.xaml.cs主要内容

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        Button oldButton = new Button();
        public MainWindow()
        {
            InitializeComponent();
        }
        private void button_Click(object sender, RoutedEventArgs e)
        {
            Button btn = e.Source as Button;
            btn.Foreground = Brushes.Black;
            oldButton.Foreground = Brushes.Black;
            oldButton = btn;
            frame1.Source = new Uri(btn.Tag.ToString(), UriKind.Relative);
        }
    }
}

在这里插入图片描述

Page2.xaml

在这里插入图片描述

Page2.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1.Examples
{
    /// <summary>
    /// Page2.xaml 的交互逻辑
    /// </summary>
    public partial class Page2 : Page
    {
        public Page2()
        {
            InitializeComponent();
            Helps.ChangeState(btnStart, true, btnStop, false);
        }

        private void btnStop_Click(object sender, RoutedEventArgs e)
        {
            MyClass.IsSTop = true;
            Helps.ChangeState(btnStart, true, btnStop, false);

        }

        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            Helps.ChangeState(btnStart, false, btnStop, true);
            MyClass.IsSTop = false;
            textBlock1.Text = "";
            MyClass c = new MyClass(textBlock1);
            MyData state = new MyData { Message = "a", Info = "\n线程1已终止" };
            Thread thread1 = new Thread(c.MyMethod);
            thread1.IsBackground = true;
            thread1.Start(state);
            state = new MyData { Message = "b", Info = "\n线程2已终止" };
            Thread thread2 = new Thread(c.MyMethod);
            thread2.IsBackground = true;
            thread2.Start(state);
            state = new MyData { Message = "c", Info = "\n线程3已终止" };
            ThreadPool.QueueUserWorkItem(new WaitCallback(c.MyMethod), state);
            state = new MyData { Message = "d", Info = "\n线程4已终止" };
            ThreadPool.QueueUserWorkItem(new WaitCallback(c.MyMethod), state);


        }
    }
    public class MyClass
    {
        public static volatile bool IsSTop;
        TextBlock textBlock1;
        public MyClass(TextBlock textBlock1)
        {
            this.textBlock1 = textBlock1;
        }
        public void MyMethod(object obj)
        {
            MyData state = obj as MyData;
            while (IsSTop==false)
            {
                AddMessage(state.Message);
                Thread.Sleep(1000);
            }
            AddMessage(state.Info);
        }
        private void AddMessage(string s)
        {
            textBlock1.Dispatcher.Invoke(() =>
            {
                textBlock1.Text += s;

            });

        }
    }
    public class MyData
    {
        public string Info { get; set; }
        public string Message { get; set; }
    }
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

新建Helps类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;

namespace WpfApp1.Examples
{
    class Helps
    {
        public static void ChangeState(Button btnStart,bool isStart,Button btnStop,bool isStop)
        {
            btnStart.IsEnabled = isStart;
            btnStop.IsEnabled = isStop;

        }
    }
}

在这里插入图片描述

运行结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在实验3的基础上实现了实验4
通过本实验,即熟悉和掌握了线程管理Thread类、线程池ThreadPool类以及
WPF中多线程的使用,又复习C#中lambda表达式和委托。

目录
相关文章
|
1天前
|
安全 算法 Java
Java并发编程中的线程安全与性能优化
在Java应用程序开发中,线程安全和性能优化是至关重要的方面。本文探讨了Java并发编程中常见的线程安全问题,并提供了实用的性能优化技巧。通过深入分析多线程环境下的共享资源访问、锁机制、并发集合等关键概念,帮助开发者有效提升程序的稳定性和执行效率。
37 15
|
1天前
|
前端开发 Java API
网络防抖动在Springboot中有哪些应用?
【6月更文挑战第25天】在 Spring Boot 中,网络防抖动(Debounce)技术可以应用于多种场景,以避免短时间内重复处理相同的请求,提高系统性能和用户体验。
23 7
|
1天前
|
Java 开发者
Java并发编程:解锁多线程同步之谜
【6月更文挑战第24天】在Java的世界里,并发编程是提升应用性能和响应能力的关键。本文将深入探讨Java中的多线程同步机制,从基础的synchronized关键字到高级的Lock接口,揭示它们背后的原理与应用场景。我们将通过具体示例,展现如何优雅地处理线程间的竞争条件,确保数据的一致性和完整性。无论你是Java新手还是资深开发者,这篇文章都将为你揭开多线程同步的神秘面纱,让你的代码在多线程环境中运行得更加顺畅。
|
3天前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
11 3
|
4天前
|
缓存 安全 Java
【技术前沿】JAVA网络编程黑科技:URL与URLConnection的创新应用,带你飞越极限!
【6月更文挑战第22天】Java的URL和URLConnection在现代网络编程中扮演关键角色,不仅用于基本HTTP请求,还在微服务(弹性自动化调用)、智能缓存策略、异步处理和安全增强方面展现创新应用。例如,它们支持动态服务发现、HTTP缓存控制、非阻塞I/O和HTTPS加密,助力开发者构建高效、安全的网络解决方案。通过掌握这些技术,可以提升项目性能,应对云计算和大数据时代的挑战。
|
2天前
|
机器学习/深度学习 算法 网络安全
机器学习在网络安全威胁检测与防御中有广泛的应用
机器学习在网络安全威胁检测与防御中有广泛的应用
8 1
|
1天前
|
缓存 安全 Java
如何使用Java实现高效的多线程编程
如何使用Java实现高效的多线程编程
|
1天前
|
安全 Java 机器人
Java中的多线程编程实用指南
Java中的多线程编程实用指南
|
2天前
|
安全 Java 开发者
Java中的多线程编程实用指南
Java中的多线程编程实用指南
|
5天前
|
机器学习/深度学习 自然语言处理 安全
探索机器学习在网络安全中的应用
本文旨在介绍机器学习技术如何增强现有的网络安全体系,通过具体案例分析展示其实际应用效果,并讨论面临的挑战与未来的发展方向。
9 0