文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Winform中C#线程控制的常见情况有哪些

2023-06-17 22:47

关注

本篇内容主要讲解“Winform中C#线程控制的常见情况有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Winform中C#线程控制的常见情况有哪些”吧!

Winform界面中,将事务放在新开的线程中操作是十分有用的做法,因为这样可以增加用户体验,减少耗时。对这些C#线程的控制,常常有下面这四种情况:

启动线程;

线程间通讯;

线程终止;

线程中的异常处理;

下面总结一些上面这些C#线程操作的常用方法。

C#线程控制1. 启动C#线程

◆如果是需要很频繁的开线程,会使用线程池(微软的或自己写的)

◆Thread.Start(参数object);

◆或者用对象提供的BeginXXXX()这种都是异步,也算多线程启动.

C#线程控制2. C#线程间通讯

◆委托,事件这些比较常用,并且对object的多线程处理需要谨慎,可能用到lock(object){}.

◆主要是通过线程同步或者回调方法(或者说是委托)来实现

C#线程控制3. 线程终止

◆线程的终止,用事件AUTORESET之类

◆可以用Thread.ManualEvent().Reset()/Set()/WaitOne()方法来判断和等待

C#线程控制4. 线程中的异常处理

◆线程中的异常通过事件传回到主线程处理

◆还是写log吧,多线程debug比较难,还是逐步log比较好.

用于C#线程通讯的lock关键字

下面的示例演示使用 lock 关键字以及 AutoResetEvent 和 ManualResetEvent 类对主线程和两个辅助线程进行线程同步。

该示例创建两个辅助线程。一个线程生成元素并将它们存储在非线程安全的泛型队列中。有关更多信息,请参见 Queue。另一个线程使用此队列中的项。另外,主线程定期显示队列的内容,因此该队列被三个线程访问。lock 关键字用于同步对队列的访问,以确保队列的状态没有被破坏。

除了用 lock 关键字来阻止同时访问外,还用两个事件对象提供进一步的同步。一个事件对象用来通知辅助线程终止,另一个事件对象由制造者线程用来在有新项添加到队列中时通知使用者线程。这两个事件对象封装在一个名为 SyncEvents 的类中。这使事件可以轻松传递到表示制造者线程和使用者线程的对象。SyncEvents 类是按如下方式定义的:

C# code

using System;   using System.Threading;   using System.Collections;   using System.Collections.Generic;    public class SyncEvents   {   public SyncEvents()   {    _newItemEvent = new AutoResetEvent(false);   _exitThreadEvent = new ManualResetEvent(false);   _eventArray = new WaitHandle[2];   _eventArray[0] = _newItemEvent;   _eventArray[1] = _exitThreadEvent;   }    public EventWaitHandle ExitThreadEvent   {   get { return _exitThreadEvent; }   }   public EventWaitHandle NewItemEvent   {   get { return _newItemEvent; }   }   public WaitHandle[] EventArray   {   get { return _eventArray; }   }    private EventWaitHandle _newItemEvent;   private EventWaitHandle _exitThreadEvent;   private WaitHandle[] _eventArray;   }   public class Producer   {   public Producer(Queue <int> q, SyncEvents e)   {   _queue = q;   _syncEvents = e;   }   // Producer.ThreadRun   public void ThreadRun()   {   int count = 0;   Random r = new Random();   while (!_syncEvents.ExitThreadEvent.WaitOne(0, false))   {   lock (((ICollection)_queue).SyncRoot)   {   while (_queue.Count < 20)   {   _queue.Enqueue(r.Next(0,100));   _syncEvents.NewItemEvent.Set();   count++;   }   }   }   Console.WriteLine("Producer thread: produced {0} items", count);   }   private Queue <int> _queue;   private SyncEvents _syncEvents;   }    public class Consumer   {   public Consumer(Queue <int> q, SyncEvents e)   {   _queue = q;   _syncEvents = e;   }   // Consumer.ThreadRun   public void ThreadRun()   {   int count = 0;   while (WaitHandle.WaitAny(_syncEvents.EventArray) != 1)   {   lock (((ICollection)_queue).SyncRoot)   {   int item = _queue.Dequeue();   }   count++;   }   Console.WriteLine("Consumer Thread: consumed {0} items", count);   }   private Queue <int> _queue;   private SyncEvents _syncEvents;   }    public class ThreadSyncSample   {   private static void ShowQueueContents(Queue <int> q)   {   lock (((ICollection)q).SyncRoot)   {   foreach (int item in q)   {   Console.Write("{0} ", item);   }   }   Console.WriteLine();   }    static void Main()   {   Queue <int> queue = new Queue <int>();   SyncEvents syncEvents = new SyncEvents();    Console.WriteLine("Configuring worker threads...");   Producer producer = new Producer(queue, syncEvents);   Consumer consumer = new Consumer(queue, syncEvents);   Thread producerThread = new Thread(producer.ThreadRun);   Thread consumerThread = new Thread(consumer.ThreadRun);    Console.WriteLine("Launching producer and consumer threads...");  producerThread.Start();   consumerThread.Start();    for (int i=0; i <4; i++)   {   Thread.Sleep(2500);   ShowQueueContents(queue);   }    Console.WriteLine("Signaling threads to terminate...");   syncEvents.ExitThreadEvent.Set();    producerThread.Join();   consumerThread.Join();   }    }

到此,相信大家对“Winform中C#线程控制的常见情况有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯