Tag: multithreading

如何在另一个线程中访问GUI-Elements?

在C#中:如何访问GUI元素,如另一个线程中的按钮或标签?

需要帮助在UI线程和C#中的另一个线程获取信息

我有一个服务器应用程序,通过网络接收信息并进行处理。 服务器是multithreading的,并且一次处理多个套接字,并且通过BeginInvoke和EndInvoke样式方法在没有我控制的情况下创建线程,这些方法由相应的回调函数链接。 我正在尝试创建一个表单,除了主GUI之外,它还显示一个ListBox项目,该项目由描述当前连接的套接字的项目填充。 所以,我基本上要做的是使用其Add()函数向ListBox添加一个项目,从该线程运行相应的回调函数。 我通过Controls属性访问我的表单控件 – IE: (ListBox)c.Controls[“listBox1”].Items.Add(); 当然我不只是调用函数,我已经尝试了几种方法,我在这里和网上在线程之间进行通信,包括MethodInvoker ,使用delegate ,结合Invoke() , BeginInvoke()等。似乎工作,我总是得到相同的exception告诉我我的控件是从一个线程访问,而不是它创建的线程。 有什么想法吗?

使用线程时内存泄漏

我似乎在这段代码中有内存泄漏。 它是一个控制台应用程序,它创建了几个类(WorkerThread),每个类都以指定的时间间隔写入控制台。 Threading.Timer用于执行此操作,因此写入控制台是在单独的线程中执行的(TimerCallback在从ThreadPool获取的单独线程中调用)。 更复杂的是,MainThread类挂钩到FileSystemWatcher的Changed事件; 当test.xml文件更改时,将重新创建WorkerThread类。 每次保存文件时(每次重新创建WorkerThread和Timer时),任务管理器中的内存都会增加(内存使用情况,有时还会增加虚拟机大小); 此外,在.Net Memory Profiler(v3.1)中,WorkerThread类的未分配实例增加了两个(这可能是一个红色的鲱鱼,因为我已经读过.Net Memory Profiler有一个错误,它很难检测到处理class级。 无论如何,这是代码 – 有谁知道什么是错的? 编辑 :我已经将类创建移出FileSystemWatcher.Changed事件处理程序,这意味着WorkerThread类总是在同一个线程中创建。 我为静态变量添加了一些保护。 我还提供了线程信息,以更清楚地显示正在发生的事情,并使用Timer与显式线程交换; 然而,记忆仍然在泄漏! Mem Usage一直缓慢增加(这只是由于控制台窗口中的额外文本?),并且当我更改文件时VM大小增加。 这是代码的最新版本: 编辑当你写入它时,这似乎主要是控制台使用内存的问题。 显式编写的Threads仍然存在增加内存使用量的问题。 请参阅下面的答案 。 class Program { private static List threads = new List(); static void Main(string[] args) { MainThread.Start(); } } public class MainThread { private static int _eventsRaised = 0; private […]

ASP.NET锁线程方法

我正在使用C#开发ASP.NET表单Web应用程序。 我有一个为客户创建新订单的方法。 它看起来与此类似; private string CreateOrder(string userName) { // Fetch current order Order order = FetchOrder(userName); if (order.OrderId == 0) { // Has no order yet, create a new one order.OrderNumber = Utility.GenerateOrderNumber(); order.Save(); } return order; } 这里的问题是,两个请求(线程)中的1个客户可能会导致此方法被调用两次,而另一个线程也可能在此方法中。 这可能导致创建两个订单。 如何正确锁定此方法,因此每个客户一次只能由一个线程执行? 我试过了; Mutex mutex = null; private string CreateOrder(string userName) { if (mutex == null) […]

这个锁有什么问题?

高度存在这个锁的问题,但我无法理解这是什么。 我强烈怀疑下面的例子没有足够的锁定。 那有什么问题呢? class example { object locker = new object(); void start() { for (int i = 0; i < 1000; i++) { (new Thread(dostuff)).Start(); } } void dostuff() { lock (locker) { //dosomething } } }

具有多个任务和UI同步的WinForms TPL模式 – 这是正确的吗?

我是TPL(任务并行库)的新手,我想知道以下是否是最有效的方法来启动1个或多个任务,整理结果并在数据网格中显示它们。 Search1和Search2与两个单独的数据库通信,但返回相同的结果。 我禁用按钮并打开微调器。 我正在使用一个ContinueWhenAll方法调用来关闭任务。 我已将调度程序添加到ContinueWhenAll调用以更新表单按钮,datagrid,并关闭微调器。 问:我这样做是对的吗? 有没有更好的办法 ? 问:我如何为此添加取消/exception检查? 问:如果我需要添加进度报告 – 我该怎么做? 我选择这种方法的原因是,后台工作者是这样我可以并行地按顺序启动每个数据库任务。 除此之外,我认为使用TPL可能会很有趣..但是,因为我找不到任何具体的例子,我在下面做了什么(多个任务)我觉得把它放在这里得到它可能会很好答案,希望成为其他人的榜样。 谢谢! 码: // Disable buttons and start the spinner btnSearch.Enabled = btnClear.Enabled = false; searchSpinner.Active = searchSpinner.Visible = true; // Setup scheduler TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext(); // Start the tasks Task.Factory.ContinueWhenAll( // Define the search tasks that return List new [] […]

例外:应用程序调用了为不同线程编组的接口

private void LogInButton_Click(object sender, RoutedEventArgs e) { var api = new RestAPI(“http://localhost:2624/”, UsernameTextBox.Text, PasswordTextBox.Password); api.AutenticarUsuarioFinalizado += (o, args) => { ProgressBar.IsIndeterminate = false; ProgressBar.Visibility = Visibility.Collapsed; LogInButton.IsEnabled = true; if (args.Error) return; if (args.Resultado.Autenticado) { } }; api.AutenticarUsuario(); ProgressBar.Visibility = Visibility.Visible; ProgressBar.IsIndeterminate = true; LogInButton.IsEnabled = false; } api.AutenticarUsuario(); 异步调用rest API,完成后调用事件处理程序api.AutenticarUsuarioFinalizado并在行ProgressBar.IsIndeterminate = false中得到此错误; 因为调用打开一个新线程,我该如何解决? 错误是: […]

在MDIParent 中使跨线程操作无效

可能重复: 跨线程操作无效 我试图从另一个线程关闭表单的基础。 我收到以下错误。 System.InvalidOperationException:跨线程操作无效:从创建它的线程以外的线程访问控制’MDIParent’。 对于以下行: MDIParent.MDIParentRef.BaseClose();

parellellizing异步调用时如何获得最大出站请求?

通过Fiddler分析下面的代码,我意识到使用Parallel Extensions我可以获得最多2个出站请求: new string[] { “http://stackoverflow.com”, “http://superuser.com”, “http://serverfault.com”, “http://stackexchange.com” } .AsParallel() .Select(a => HttpWebRequest.Create(a).GetResponse()) .ToArray() ; 我应该使用什么方法来最大化出站请求的数量?

在没有控件的情况下使用invoke

我有一个Component(System.ComponentModel.Component) 该组件从另一个Thread接收事件。 通常我会使用这种模式在GUI线程中执行此代码 private void handle_Event(object sender, EventArgs e) { var control = this.Button1; if (control.InvokeRequired) control.Invoke(() => DoSomething()); else DoSomeThing(); } 但是,在这种特殊情况下,我没有控制权。 我该怎么做呢?