Tag: multithreading

在控制台或Web应用程序中使用async / await

据我所知,C#中的async / awaitfunction将await调用之间的段拆分为在每个等待的方法在单独的工作线程上返回后在调用线程上运行的回调方法。 在等待时间内,调用线程是“空闲的”。 必须通过某种事件循环在调用线程上调度回调。 此事件循环仅存在于Windows窗体或WPF等GUI应用程序中。 释放此循环可确保UI在长时间操作期间保持对其他用户交互的响应。 控制台应用程序和Web应用程序(ASP.NET)没有此类事件循环,因此此回调机制不起作用。 但话说回来,他们没有事件循环,因为他们不需要。 没有用户在任何时候尝试与正在运行的程序进行交互,期望立即反馈。 所以没有必要释放调用线程。 操作使用的线程数无关紧要,它只在最后一位完成后返回。 那么在控制台和Web应用程序中使用async和await是什么,或者通常是任何类型的非交互式代码,例如Windows服务? 与简单的同步调用相比,它有何不同或更高效? 我正在设计一个由GUI和非交互(服务和Web)程序使用的API,并且很难理解它在非GUI环境中的行为。

从Invoke方法获取RETURN

我试图从另一个线程上的列表框项读取值。 我试图创建一个新的方法来运行invoke命令,我可以设法发送命令到列表框,如通过调用方法添加,但我似乎无法得到响应,我似乎无法得到项目的价值,我尝试了几种方法,一旦我将它从一个空格改为一个字符串,事情开始变得毛茸茸…… thread t1 = new thread(thethread) t1.start() public void thethread() { string text = readListBoxSelected(listBox1) + ” lala” ; } public static string readListBoxSelected(ListBox listbox) { if (listbox.InvokeRequired) { return (string)listbox.Invoke( new Func(() => readListBoxSelected(listbox)) ); } else { string varText = listbox.SelectedValue.ToString(); return varText; } } 以上是我想要做的一个例子。 这是错误: System.NullReferenceException未被用户代码处理 Message =对象引用未设置为对象的实例。 Source = […]

在单独的线程上执行进程会导致System.IO .__ Error.WinIOError

我正在编写一个基本的GUI应用程序,基本上调用给定一些参数的其他进程,而这些应用程序的输出通过richtext框实时显示给用户。 所以基本上我有一个运行子进程的独立进程线程。 大多数进程在该线程上运行正常,除了xdiscbld.exe(一个Xbox ISO映像创建工具)崩溃说: Unhandled Exception: System.IO.IOException: The handle is invalid. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.Console.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded) at System.Console.get_BufferWidth() at XDiscBld.XDiscBldProgram.ProcessDisc() at XDiscBld.XDiscBldProgram.Run(String[] args) at XDiscBld.XDiscBldProgram.Main(String[] args) (顺便说一句,xDiscBld通过命令提示符或单线程进程调用运行正常) 我通常不会发布这样一个特定的错误,但我真的很难过,我认为它可能是与线程的常见问题和保持某种IO句柄有关的通用问题。 如果有人对类似的问题有过任何体验,或者对此有任何见解,那么它就会受到影响。

在C#Winforms中使用multithreading的响应式GUI

我的申请表中有一个子表单。 这个表格有大约50个combobox,每个人都从数据库中获取数据。 所有组合都在表单的加载事件中加载。 数据很大。 数据检索大约需要2分钟。 当我打开这个表单时,我的整个应用程序都没有响应。 应用程序挂起并在大约2分钟后恢复生命:/ 正如我所研究的,我们可以使用不同的线程来避免这种情况。 有人可以指导,实现multithreading是否可行,安全可靠,以使我的应用程序响应? 请指导我并编写一个示例代码,如果可能的话,multithreading如何在c#中工作。 您可以简单地解释使用具有gridview的表单,该表单在单独的线程中将数据表作为daTASOURCE,并且GUI响应甚至数据库需要太多时间…任何帮助都表示赞赏。提前提醒!

GetCurrentProcessorNumber()如何工作? 运行时线程的CPU核心?

是否有任何流畅的方法来查找运行时在multithreading代码中运行的线程的CPU核心ID? 我试图使用GetCurrentProcessorNumber(),但它似乎没有给出各个线程正在运行的CPU核心ID。 我一直在使用的代码是: using System; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; using System.Runtime.InteropServices; class S { [DllImport(“kernel32.dll”)] static extern int GetCurrentProcessorNumber(); static void Main() { Task t1 = new Task(A, 1); Task t2 = new Task(A, 2); Task t3 = new Task(A, 3); Task t4 = new Task(A, 4); int myProcessorNum = GetCurrentProcessorNumber(); Console.WriteLine(“processNo: ” […]

使用闭包而不是锁用于共享状态的优缺点是什么?

我正在尝试评估什么是在单作者单读者场景中共享状态的最快解决方案,其中读者只消耗作者分配的状态变量的最新值。 共享状态可以是任何托管类型(即引用或值类型)。 理想情况下,同步解决方案的工作速度与尽可能简单的非同步解决方案一样快,因为该方法可能会用于单线程和multithreading场景,可能需要数千次。 读取/写入的顺序无关紧要,只要读取器在某个时间范围内接收到最新值(即读取器只能读取,永远不会修改,因此更新时间无关紧要,只要它没有接收到旧价值之前的未来价值…) 天真的解决方案,没有锁定: var memory = default(int); var reader = Task.Run(() => { while (true) { func(memory); } }); var writer = Task.Run(() => { while (true) { memory = DateTime.Now.Ticks; } }); 天真解决方案的问题究竟是什么? 到目前为止我已经想到了这些: 无保证读者看到最新值(没有内存屏障/易失性) 如果共享变量的类型不是基本类型或引用类型(例如,复合值类型),则读取器消耗的值可能无效。 直接的解决方案是锁定: var gate = new object(); var memory = default(int); var reader = Task.Run(() => { […]

您能想到.NET中具有同步上下文的事件模式吗?

主要问题是,从一个线程引发事件可以调用应该只在某个线程上下文中调用的委托。 在对这个问题做了一些研究后,我想,也许它可以传递某种同步上下文以及每个订阅事件: SomeClass.SmartSyncEvent += (myDelegate, someReferenceToAThread); 然后提出事件,它以某种方式: foreach(subscriber) { someReferenceToAThread.Invoke(myDelegate); } 这是超伪代码,但也许有人已经做过这样的事情,或者知道任何可以设置这种模式的.NET类。 谢谢!

如何在不锁定的情况下读取此实例原始线程安全?

下面的类的问题是当读取myThreadSafe.Value它可能不会返回最新的值。 public class ThreadSafe { private int value; public int Value { get { return value; } } public void Update() { Interlocked.Add(ref value, 47); // UPDATE: use interlocked to not distract from the question being asked. } } 我知道在阅读和写作时我可以锁定: public int Value { get { lock(locker) return value; } } public void Update() { […]

C#/ WinForms:ShowDialog和随后的表格显示

由于我认为与此无关的原因,我有一个或多个与单个实例UI(表单)通信的线程。 在工作线程中,我需要报告进度或输入数据或简单选择。 所有这些都来自用户与UI的交互,当然,对于M $ .NET,所有UI都在主线程中运行。 显然,我需要处理UI(主)线程和工作线程之间的线程同步。 我通过正确validationInvokeRequired和公司来做到这一点。 在那里有一些文章和文章讨论InvokeRequired , IsHandleCreated , IsDisposed等中的不一致和细微之处,所以我不会谈论它。 我只需要说我的UI,即只是一个Form,应该显示为模态或无模式 ,具体取决于调用者的愿望。 一个可能只是UI.Warn( “Warning!” )而其他可能是UI.Question( “Make a choice:”, options… ) 。 现在考虑下面的M $ DN文档摘录: Form.ShowDialog方法: 与非模态表单不同,当用户单击关闭表单按钮时,.NET Framework不会调用Close方法… 我从未参加过一个显示为模态的表单,但是他们的实现者说它不会被破坏,在关闭(隐藏)后可能会处于不可用的状态。 但确实如此! 当表单从ShowDialog( )返回时,它的Handle被删除了,因为它相信当再次需要它时,将调用ShowDialog( )并重新创建句柄。 我不知道为什么M $的东西需要这样做,但我只是觉得我能够拥有完全像模态或无模式的完全相同的forms而没有问题。 M $ DN docs没有说它是被禁止的(或者我太醉了而无法找到它)! 好吧,最后它是一种相对简单(和肮脏)的方法来修复它。 var r = ShowDialog( ); // Handle thrown away aftr “ShowDialog()” supposing the // […]

当线程被杀死时如何杀死播放循环?

遇见线程: public void TimerFunc(){ … while (true) { … sound.PlayLooping(); // Displays the MessageBox and waits for user input MessageBox.Show(message, caption, buttons); // End the sound loop sound.Stop(); … } } 线程由主界面中的按钮启动,并且可以被界面中的按钮杀死。 如果线程在等待用户输入时被杀死,我如何让soundloop停止?