Tag: multithreading

Windows服务中的多个线程

我有一个Windows项目和一个表格,每5秒有一个计时器。 它从请求命名表时间和条件方式调用和处理方法。 但我有一些方法类型需要花费太多时间来响应并希望这些方法在单独的线程中。 这样我就可以在单独的线程和同步中运行这两种请求类型。 如何使用线程 – 多异步线程将它们分开?

如何在非表单应用程序中生成击键

所以我有一个庞大的程序,并决定我应该在一个单独的线程中运行其中一个方法。 所以我把方法放在一个单独的类中,在我的表单上激活它。 它似乎工作正常我想要它,直到它分手它给我这个错误: SendKeys无法在此应用程序内运行,因为应用程序未处理Windows消息。 更改应用程序以处理消息,或使用SendKeys.SendWait方法。 我试着在线寻找答案。 我想我看到了一些关于SendKeys如何只在Form或其他东西中工作的东西。 任何人都可以告诉我一种不使用SendKeys来模拟击键的方法,或者是一种让SendKeys在不同的非forms线程中工作的方法吗?

如何使用带有箭头键的列表框移动图片框?

每件事都没关系form1 + picturebox1我可以使用下面的代码: public Form1() { InitializeComponent(); KeyDown += new KeyEventHandler(Form1_KeyDown); } private void Form1_KeyDown(object sender, KeyEventArgs e) { int x = pictureBox1.Location.X; int y = pictureBox1.Location.Y; if (e.KeyCode == Keys.Right) x += 5; else if (e.KeyCode == Keys.Left) x -= 5; else if (e.KeyCode == Keys.Up) y -= 5; else if (e.KeyCode == Keys.Down) […]

如何使用后台线程中的信息更新WPF窗口?

我正在创建一个wpf应用程序,它在后面执行许多任务,但仍然需要UI响应并显示各种后台任务的状态。 它还可以选择不显示UI,在这种情况下,应该丢弃状态消息而根本不创建主窗体的实例。 我试图删除 StartupUri=”MainWindow.xaml” 来自App.xaml。 然后,在App.xaml.cs中,我有 ` public App() { Startup += new StartupEventHandler(App_Startup); } void App_Startup(object sender, StartupEventArgs e) { // Code which loads application settings is here if (pf.ShowUI) { MainWindow mainWindow = new MainWindow(); mainWindow.Show(); } // The background processes will begin here. }` 如有必要,这将显示主窗体并启动所有后台进程。 这部分有效。 为了从后台向UI发送消息,我实现了一个非常基本的信使: ` internal interface IMessageHandler { […]

关于使用backgroundworker / thread时防止GUI变得迟缓的C#问题

我正在尝试构建一个小型应用程序,它登录到服务器并不断收集来自它的数据。 我遇到的问题是即使使用后台工作程序或线程,我的GUI响应也很慢。 当我的应用程序尝试登录到服务器时,我看到“(无响应)”出现在我的登录表单中,但它在几秒钟后登录而没有Windows给出“程序已停止响应…终止应用程序”对话框。 当我点击我的应用程序上的开始按钮时,我注意到GUI变得非常缓慢和无响应。 我想知道如何才能改善程序的响应时间。 以下是使用后台工作程序的Login表单的代码以及从服务器收集数据的我的线程的代码。 我为代码的最后一部分没有正确格式道歉,但是SO是不合作的。 private void btnLogin_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(txtAccount.Text) || string.IsNullOrEmpty(txtPassword.Text)) { MessageBox.Show(“Must Enter Username and Password”); return; } btnLogin.Enabled = false; account = txtAccount.Text; password = txtPassword.Text; accountType = cmbAccountType.SelectedItem.ToString(); loginBackgroundWorker.RunWorkerAsync(); } private void loginBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { loginSuccess=tradingDesk.Login(account, password, accountType); } private void loginBackgroundWorker_RunWorkerCompleted(object sender, […]

在C#中异步运行任务

我有一些在我的WinForms应用程序中运行的过程繁重的任务。 问题是,在运行时,它会冻结UI(UI主线程)。 我还没有在C#中使用线程和委托做那么多,这就是为什么我希望有人可以帮助我,如何处理那些过程繁重的任务,而不会冻结UI,因此用户不认为应用程序崩溃在等待? 例如。 我通过FrontController打电话需要时间: _controller.testExportExcel(wrapper, saveDialog.FileName); 因为它正在创建一个Excel文件。 在工作时,我不会让应用程序在UI上做出响应。 流程繁重的任务的另一个例子可能是这样的: private void dataGridView_liste_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { if (e.ListChangedType != ListChangedType.ItemDeleted) { foreach (DataGridViewRow r in dataGridView_liste.Rows) { DataGridViewCellStyle red = dataGridView_liste.DefaultCellStyle.Clone(); red.BackColor = Color.LightGreen; if (r.Cells[“News”].Value != null && (bool)r.Cells[“News”].Value == true) r.DefaultCellStyle = red; } } } foreach循环需要时间,并冻结UI。 运行该进程并在完成时自动关闭的异步线程可能对我有用。 但它是如何工作的?

如何在ASP.NET / WCF中定期执行某些操作?

首先抱歉提出这样一个愚蠢的问题,我是asp.net的新手。 所以,我应该定期做一些事情,说我是网站heartpatients.com的所有者(假设),我希望每个访问该网站的网站用户都能在2小时后显示一条消息“拿你的药”。 所以,基本上这都是我的问题,我应该在每2小时(或4,6之后的任何时间)之后显示此消息,我也可以如何自定义时间。 还有一件事,比如我在WCF服务中有这个方法,它显示了这条消息,如何在特定时间调用该服务,甚至用户配置(比如有人在10小时后吃药?)那么如何在用户指定的时间之后定期调用该服务(服务中的特定方法)? 我希望我的问题很清楚。 任何帮助表示赞赏。

如何在后台线程中连接到远程服务器上的数据库?

我有一个Windows窗体,我在其上显示本地数据库中的数据。 我还要连接到远程数据库,并从那里显示一些其他数据..但是,这个远程数据库可能会关闭或缓慢。 我尝试连接到此远程数据库时,我不希望UI冻结。 所以对线程或线程安全一无所知,这是我的一个例子: RemoteDataContext rdt; private void GetRemoteDataContext() { rdt = new RemoteDataContext(RemoteServerConnectionString); } private void FillFromRemoteDataContext() { lblTest.text = rdt.TestTable.First().TestField; } private void Form1_Shown(object sender, EventArgs e) { Thread t = new Thread(new ThreadStart(new delegate { try { GetRemoteDataContext(); FillFromRemoteDataContext(); } catch { } // ignore connection errors, just don’t display data ); […]

线程无法正常工作

我有一个应用程序,重复我听到的数字,然后记录我读到的数字。 数字是0,1,2,3,4,5,6,7,8,9 。 我使用for循环播放这些数字与文本到语音技能,这是来自第三方。 对于录制部分,我必须按照第三方要求将其放在单独的线程中。 要录制语音,方法很可能是: recordVoiceResource.Record(fileName); 要停止它,请使用: recordVoiceResource.Stop(); 现在我发现有时我的录音是0秒,这意味着代码可能没有达到Record行。 有时它只有2秒钟。 我相信线程安排是错误的。 private ManualResetEvent terminate = new ManualResetEvent(false); PlayTTS(“Please repeat the following numbers as you hear them.”); Thread t = new Thread(() => RecordNumbers()); t.Start(); Thread.Sleep(2000); terminate.Set(); terminate.WaitOne(); PlayNumbers(); recordVoiceResource.Stop(); 线程方法是: private void RecordNumbers() { recordVoiceResource = TelephonyServer.GetVoiceResource(); recordVoiceResource.MaximumSilence = 1; recordVoiceResource.MaximumTime = 30; // […]

Thread.Abort()方法冻结

所以我用AbortException搜索它因为使用不安全的代码而冻结,并且只有当控制流返回到托管代码时AbortException抛出AbortException 。 所以,在我的情况下,我有一个本地库,在一个线程中调用。 所以有时我不能中止它,因为库是本机的,而Abort方法不仅不做任何事情,而是冻结调用线程。 所以,我想解决它。 例如,使用不同的过程应该有所帮助,但它非常复杂。 因此,一个不太重的解决方案是使用’AppDomains’。 但无论如何我应该创建一个exe并调用它。 我试着像这样在内存中生成它 var appDomain = AppDomain.CreateDomain(“newDomain”); var assemblyBuilder = appDomain.DefineDynamicAssembly(new AssemblyName(“myAsm”), AssemblyBuilderAccess.RunAndCollect); var module = assemblyBuilder.DefineDynamicModule(“myDynamicModule”); var type = module.DefineType(“myStaticBulder”, TypeAttributes.Public); var methBuilder = type.DefineMethod(“exec”, MethodAttributes.Static | MethodAttributes.Public); var ilGenerator = methBuilder.GetILGenerator(); 但我发现只有EMIT方式,它非常复杂。 是否存在肤浅的解决方案?