【c# – 等待后台线程完成】教程文章相关的互联网学习教程文章

c# – 单线程上的线程WaitHandle【代码】

我的代码是public static void Invoke(Action[] Actions) {Thread[] threadArray = new Thread[Actions.Length];for (int i = 0; i < Actions.Length; i++){threadArray[i] = new Thread(() =>{Actions[i].Invoke();});threadArray[i].Start();} }public static void WaitAll() {}public static void WaitAny() {}我想等待所有线程完成,并在任何线程完成时收到通知, 喜欢WaitAny,WaitAll 但是waithandles只能在线程池上使用,找不到...

c# – 中止被阻塞线程的正确方法【代码】

我正在创建一个TCP连接的服务器. TCP连接在其自己的线程中运行无限长的时间.是否有一个好的模式允许安全关闭TcpListener和客户端以及线程?以下是我到目前为止的情况.private volatile bool Shudown;void ThreadStart1() {TcpListener listener = null;TcpClient client = null;Stream s = null;try{listener = new TcpListener(60000);client = listener.AcceptTcpClient();Stream s = client.GetStrea();while(!Shutdown) // us...

c# – 在不阻止UI线程的情况下从任务返回【代码】

我有一个返回数据表的方法.我需要在一个线程中运行所有的sql东西,然后能够传回一个数据表,而不会阻塞UI线程.根据我的理解,当您调用Task.Result时,它会阻止UI线程,直到任务完成.我该如何解决这个问题.我读到了关于使用await和async的问题,但我还没有弄清楚如何在任务中使用它.public static DataTable LaunchLocationMasterListReport(ObservableCollection<string> BuiltConditionsList, ObservableCollection<string> BuiltSortLi...

c# – Mutex跨线程?【代码】

所以,我使用下面的代码得到一个例外.我已经把它的异常细节,但我相信它是由一个不同的线程释放锁然后启动锁定的事实引起的.我想这样做可能允许我的主线程继续写入队列并发生. 首先,我想知道是否有办法可以做到这一点?其次,如果这样做或者这是一个糟糕的计划?看过ManualResetEvent,Monitor和Mutex所有这些似乎都是这样做的.请注意,这是针对网络服务器的,这是我第一次编写多线程,可能是高流量的服务器. 例外:第一次调用send(及其回...

c# – 如何在另一个完成时停止一个线程【代码】

我有这个代码Thread thread1 = new Thread(this.DoSomething1);Thread thread2 = new Thread(this.DoSomething2);thread1.Start();thread2.Start();我需要第一个完成的线程立即杀死另一个.请注意,该线程不是那种运行的类型,所以我不能使用静态变量告诉线程停止.哪个帖子会先结束?解决方法:理想情况下,您希望使用取消令牌或静态变量来安全地取消线程. 如果您决定使用cancellationToken / tokenSource:var tokenSource = new Cance...

c# – 多个等待来自FIFO顺序的单个线程恢复到同一个任务?【代码】

假设从单个线程创建并等待多次Task.恢复订单是FIFO吗? 简单的例子:Debug.Assert()真的是一个不变的吗?Task _longRunningTask;async void ButtonStartSomething_Click() {// Wait for any previous runs to complete before starting the nextif (_longRunningTask != null) await _longRunningTask;// Check our invariantDebug.Assert(_longRunningTask == null, "This assumes awaits resume in FIFO order");// Initialize_l...

C# – 即使在调用之后,在不同的线程中添加UserControl也会导致异常【代码】

我在winfroms中构建了一个自定义UserControl,并通过辅助线程将其添加到Panel中. 我知道当通过辅助线程添加控件时,您需要调用主线程来执行它.所以我做了..但我仍然得到一个例外,说“跨线程操作无效:控制’pictureBoxImage‘从一个线程访问,而不是它创建的线程.” 我被卡住了,不知道是什么导致了这个因为我尝试通过在每个自定义UserControl方法上放置一个断点来调试它,但是它们中的任何一个都没有引发异常.private void addControl(...

c# – ConcurrentDictionary中的AddOrUpdate线程是否安全?【代码】

我试图在ConcurrentDictionary中使用AddOrUpdate方法. 从本页https://msdn.microsoft.com/en-us/library/dd287191(v=vs.110).aspx的“备注”部分开始,它说“However, delegates for these methods are called outside the locks to avoid the problems that can arise from executing unknown code under a lock. Therefore, the code executed by these delegates is not subject to the atomicity of the operation.” 所以我不确...

c#之线程同步--轻量级同步 Interlocked

轻量级同步 Interlock 为什么说它是轻量级呢?因为它仅对整形数据(即int类型,long也行)进行同步。 如果你学过操作系统里面的PV操作(即信号量),那么你对它已经了解了一般。它实现的正是如同信号量的功能。下面是它提供的方法:Interlocked.Increment(ref value)数值加一(原子性操作)Interlocked.Decrement(ref value) 数值减一(原子性操作)Interlocked.Exchange(ref value1, value2) 交换:把值2赋给值1;返回新值Interlo...

c# – 为什么Parallel.ForEach改变了它的线程文化?【代码】

今天我遇到了一个我无法解释的奇怪现象.在gridview中有一个包含多个行的网页,需要将其逐个保存到数据库和XML文件中.我最终使用了Parallel.ForEach,因为行之间没有关系,所以它们可以独立执行.代码基本上是这样的:Parallel.ForEach(gvWithData.Rows.Cast<GridViewRow>(), row =>{if (row.RowType == DataControlRowType.DataRow){// do some logic and stuff...var type = new Object { ... };// save to the databasetype.Save();/...

c# – 当使用STA和线程花费太长时,表现形式奇怪【代码】

我们正在用C#开发一个多线程游戏引擎,我们遇到了一个问题,我们需要STAThread属性(或者手动将我们的线程设置为STA)以启用拖放支持(如果没有STA,则不能设置AllowDrop).但是,当我们启用STA并且更新方法比draw方法花费的时间更长时(如下所示),窗口不再正常运行 – 当它在任务栏中单击时,它不会像您期望的那样最小化和最大化它.不同系统的确切行为是不同的,我猜这种竞争条件会起作用. 这是我们的测试代码:[STAThread]public static voi...

c# – 没有第二种形式的多线程消息【代码】

我有一个使用COM组件的C#应用??程序.此COM组件需要消息泵(Application.Run())来执行其处理.这意味着它一直停留在主线程上.但是我最近发现可以在另一个获得自己的ApplicationContext的线程上启动另一个Application.Run. 所以我想在其自己的Application.Run()中将COM组件托管在自己的线程上,但我无法弄清楚如何在不创建UI表单的情况下在新线程上启动. 我需要与线程通信的WindowsFormsSynchronizationContext才会在Application.Run()之...

C#多线程编程:使用并发集合

原文链接:https://www.cnblogs.com/wyt007/p/9486752.html 编程需要对基本的数据结构和算法有所了解。程序员为并发情况选择最合适的数据结构,那就需要知道很多事情,例如算法运行时间、空间复杂度,以及大写0标记法等。在不同的广为人知的场景中,我们总知道哪种数据结构更高效。 对于并行计算,我们需要使用适当的数据结构。这些数据结构具备可伸缩性,尽可能地避免锁,同时还能提供线程安全的访问。.NET framework版本4引入了System.C...

C# ThreadPool类(线程池)【代码】【图】

地址:https://www.cnblogs.com/scmail81/archive/2018/08/19/9503266.html CLR线程池并不会在CLR初始化时立即建立线程,而是在应用程序要创建线程来运行任务时,线程池才初始化一个线程。线程池初始化时是没有线程的,线程池里的线程的初始化与其他线程一样,但是在完成任务以后,该线程不会自行销毁,而是以挂起的状态返回到线程池。直到应用程序再次向线程池发出请求时,线程池里挂起的线程就会再度激活执行任务。这样既节省...

C# 线程知识--使用Task执行异步操作【代码】

来源:https://www.cnblogs.com/pengstone/archive/2012/12/23/2830238.html 在C#4.0之前需要执行一个复杂的异步操作时,只能使用CLR线程池技术来执行一个任务。线程池执行异步任务时,不知道任务何时完成,以及任务的在任务完成后不能获取到返回值。但是在C#4.0中引人了一个的任务(System.Threading.Tasks命名空间的类型)机制来解决异步操作完成时间和完成后返回值的问题。 1.使用Task类创建并执行简单任务 通过使用T...