WPF从主线程停止BackgroundWorker
我有一个背景工作者在后台执行工作.该工作是在命令提示符中运行的一些.EXE应用程序,并等待输出以显示.有时,.EXE应用程序是堆栈或需要大量时间.我想在一分钟后停止工作,以防它仍在运行. 问题是我有一个在主线程中运行1分钟的进度栏.当进度栏已满(1分钟后)从主线程(UI))时,我想停止工人.这是我的代码: private void btnTest_Click(object sender, RoutedEventArgs e) { wTest = new BackgroundWorker(); wTest .DoWork += new DoWorkEventHandler(wTest _DoWork); wTest .RunWorkerCompleted += wTest _RunWorkerCompleted; wTest .WorkerReportsProgress = true;
232 2024-04-26
编程技术问答社区
饲养员应用的多线程架构
这是我在这里的第一篇文章,所以如果结构不好,则很抱歉. 我们已被任命设计一种将: 的工具 读取(帐户ID)的文件,CSV格式 从网络下载每个帐户的帐户数据文件(通过ID)(REST API) 将文件传递给将产生报告(财务预测等)的转换器[〜20ms] 如果预测阈值在限制范围内,请运行解析器以分析数据[400ms] 生成了以上分析的报告[80ms] 将生成的所有文件上传到Web(REST API) 现在,所有这些要点都相对容易.我有兴趣找出如何最好地构建某些东西来处理此问题,并在我们的硬件上快速有效地做到这一点. 我们必须处理约200万个帐户.方括号给出一个平均每个过程需要多长时间的想法.我想使用机器上可用的最大资源-24 Core Xeon处理器.这不是记忆密集型过程. 使用TPL并将每个任务作为任务创建是个好主意吗?每个都必须依次发生,但可以一次完成许多.不幸的是,解析器没有多线程意识,我们没有来源(这本质上是黑匣子的). 我的想法就是这样
162 2024-04-26
编程技术问答社区
有多个线程时的WriteableBitmap异常
我创建了大约10个线程进行相同的工作 - 从Internet下载图像.下载完成后,它将提高此回调功能: private void DownloadImageWrapper(IRestResponse response, params object[] args) { byte[] imageData = response.RawBytes; using (Stream ms = new MemoryStream(imageData)) { WriteableBitmap wbImg = PictureDecoder.DecodeJpeg(ms); callback.DynamicInvoke(wbImg, file); }; } 例外与可写的次数一致.我读到锁会有所帮助,但找不到有关"什么"我应该锁定的任何东西.有人会帮助吗? 解决方案 需要在UI线程上创建可写入的bit. 您必须将所有照片保留为像
6 2024-04-26
编程技术问答社区
当在独立的线程上启动事件处理类时,GUI会更新吗?
我们有一个DLL,可以监视状态变化,并从单独购买的产品中寻找事件.实际上,这是西门子的屏幕电池API,对于那些可能知道这是什么的人.我使用c#.net 3.5作为平台. 此API需要很长时间才能初始化,因此我们要使用单独的线程来初始化它.当前,我们在名为ScreenPop的类中具有功能.该类监视2个事件,一个状态更改事件和一个屏幕流行事件(数据告诉我们客户是谁在打电话). 当前实施的方式不起作用,或者至少无法可靠地工作.在ScreenPop类中,有一个初始化方法,其中所有长期运行的启动代码都已放置.这是从班级的构造函数中称为: public ScreenPop( string Address, int Ext, CallbackStatusType pStatusFunc, CallbackScreenPopType pPopFunc ) { CallbackStatus = pStatusFunc; CallbackPopup = pPo
4 2024-04-26
编程技术问答社区
从另一个线程更新一个可观察集合的最佳/最简洁的策略
通常,我检查是否可以访问ObservableCollection,如果没有,我会拨打Dispatcher.这里(在Stackoverflow上)也是其他一些解决方案,但我不知道什么是最好,最干净的方法.我认为我的解决方案已过时,不应再使用. 在我的示例中,ItemsCollection绑定到UI. _UpdateTheCollectionFromAnotherThread()将被调用(从另一个thread中打开另一个thread),并将数据临时保存到items.之后,我会检查访问权限,并在需要时致电dispatcher. 这是我必须去的方式还是有更好,更清洁的解决方案? fooclass public class FooClass { // #############################################################################################################
10 2024-04-26
编程技术问答社区
为什么我不能在WPF中从System.Threading.Timer回调中使用CapturePhotoToStreamAsync?
我在Winforms应用程序中具有代码,我正在使用WinRT MediaCapture对象从设备的相机中拍摄照片.该代码在system.threading.timer回电中执行.我正在尝试将此代码移至WPF中,但我遇到了问题.当我尝试执行MediaCapture.capturephototostostreamasync中的定时器回调,我会收到以下例外: 'system.exception'的第一个机会例外发生在myAssembly.dll 中 其他信息:该请求在当前状态无效. 开始 i可以创建一个用于执行方法1000次的循环,但是它将起作用,但是,如果从计时器回调中调用该方法,则会炸弹. 因此,为了澄清,该代码将在计时器回调中在Winforms中使用 该代码将在计时器回调中轰炸WPF 如果代码未在计时器回调中执行,则该代码将在WPF中使用. 我怀疑问题与正在执行的线程有关,但是,我尝试使用调度程序无济于事. 这是称为: 的方法 public a
6 2024-04-26
编程技术问答社区
用TPL和/或BackgroundWorker处理间歇性的IO作业
我有一个与一些串行和USB设备进行交互的C#应用​​程序.我正在尝试找到一种以平行方式命令这些设备的好方法,以便可以一次控制许多设备.我将通过用户输入和脚本命令启动命令. 我目前正在尝试找出一种干净的方法来"收集"并平行于我的UI线程运行命令.我有多个表格,一种用于每个设备,每个都有一些可以发出命令的控件. 我目前看到的方式将单击一个按钮,该按钮将以表格启动事件.另一个类使它称为CommandManager将涉足所有这些事件.每个事件都通过必要的信息来形成命令以发送到设备. 当事件由CommandManager处理时,它构成命令并将其添加到BlockingCollection中,在命名DeviceCommandWorker的子分类DeviceCommandWorker中,该> DeviceCommandWorker是在应用程序打开时启动的.它所做的就是循环在包含Task.Factory.StartNew()调用的代码块上. 在StartNew块中
6 2024-04-26
编程技术问答社区
尽管线程库中有可用的线程,但Task.Factory.StartNew启动时有很大的延迟。
这个问题是我提出过的一个问题的延续: 它需要更多要开始运行的任务比几秒钟 我现在知道如何确切地重现这种情况. task.factory.startnew安排在线程池上,因此我正在记录以下内容(就在我调用Factory.startnew之前): int workerThreads = 0; int completionPortThreads = 0; ThreadPool.GetMaxThreads(out workerThreads, out completionPortThreads); ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads); var tokenSource = new CancellationTokenSource(); CancellationToken
12 2024-04-26
编程技术问答社区
与ListView的跨线程问题
好的,在大家发布重复之前,让我通知您,我已经查看了所有其他帖子,并且我仍然失去了一些说话,请使用代表或背景工作者等...但是我该如何使这个线程安全我想在上删除文件它自己的线程. 这是我正在使用的代码. private void button1_Click(object sender, EventArgs e) { cleanFiles.RunWorkerAsync(); } private void cleanFiles_DoWork(object sender, DoWorkEventArgs e) { if (listView1.CheckedItems.Count != 0) { // If so, loop through all checked files and delete. for (int x = 0; x
8 2024-04-26
编程技术问答社区
显示/隐藏标签由另一个线程
某些人在我的代码中不起作用,所以我想问一下是否有人可以帮助我.我到目前为止有这个: private void searchList_TextChanged(object sender, EventArgs e) { Thread th = new Thread(new ThreadStart(setLabel)); th.IsBackground = true; th.Start(); //some code that needs time if (searchBox.Text == String.Empty) { listViewType.Items.Clear(); fillListView(); } else { listView
8 2024-04-26
编程技术问答社区
服务与线程
我应该用什么来制作一个将要: 向用户询问用户名和密码 授权 运行无限>循环,其中每10秒左右从网站获取一些数据. 我希望能够在此期间执行一些基本任务,或者锁定屏幕而不会被杀死.我不希望该服务在关闭应用程序后继续运行,我只想确保该线程在运行很长时间时永远不会被杀死. 我还想问:服务是否像线程一样易于互动?我可以在其中传递CancellationToken并在用户按下停止按钮时取消它? 我还找到了setThreadPriority,在我的情况下会有所帮助吗? 解决方案 服务和线程是完全不同的概念.线程是一个并行执行的单独过程.服务是没有UI并具有单独的生命周期运行的应用程序的组成部分.服务不在自己的线程上运行,而是在UI线程上运行(尽管可以在愿意的话上启动线程). 如果您想执行某些任务,但不绑定到Android活动生命周期,则使用服务.如果要并行运行,请使用线程.如果两者都需要,则使用启动线程的服务. 根据我的阅读内容(活动完成后您不希望线程继
12 2024-04-26
编程技术问答社区
Task.WhenAll(Task.Run(async method))与Task.WhenAll(async method)之间的区别
我一直在试图弄清楚为什么UI从ViewModel方法中阻止,并意识到代码的这一部分: await Task.WhenAll(getOutput1(), getOutput2()); 是问题所在.我设法通过使用: 来解除UI的阻止. await Task.WhenAll(Task.Run(() => getOutput1()), Task.Run(() => getOutput2())); getOutput1()和getOutput2()均为async,Task在ViewModel中返回类型,并且从视图中调用代码. 呼叫任务有什么区别. 解决方案 呼叫任务有什么区别. 直接调用该方法将在UI线程上调用它们.从Task.Run中调用它们会在线程池线程上调用它们. 结论:getOutput1和/或getOutput2实际上不是异步. (一种方法完全有可能返回Task - 因此出现异步 - 但实际上只是同步阻止). 其他解决方案 如果方法是纯粹的
18 2024-04-26
编程技术问答社区
应用程序_结束和后台进程,优雅地退出ASP.Net应用程序
我有一个ASP.NET应用程序,该应用程序使用threadpool.queueuserworkitem()向某些背景工人发射.在大多数情况下,运行零背景线程,但是一次有可能一次执行5-6个.此外,大多数人将在几秒钟内完成,但是它们可能会持续长达10分钟. 给定所有可能导致ASP.NET应用程序关闭的不同方案,我想在应用程序需要关闭时优雅地退出这些背景过程,并且它们正在处理中间. 我不希望有太多问题创造出一种方式来发出过程来提早停止工作并在接到该应用程序被关闭的呼叫的几秒钟内清理.尽管如果有人对此有具体建议,我肯定会感谢它. 我的两个主要问题是: 1)什么时候告诉背景工人将事情包裹起来.在application_end期间? dispose()?或者也许是我不知道的第三种选择. 2)如果我在上述活动期间等待在返回之前要完成的流程,那么如果没有application_end返回可能会引起应用程序更严重的问题,而不是很好地关闭后台作业. void Appli
6 2024-04-26
编程技术问答社区
如何在多线程应用程序中安全地显示消息框?
我有一些背景工作,如果发生错误的话,我想显示一个消息框. 首先,我尝试了 var _timer = new System.Threading.Timer((o) => { if(!DoCheck()){ Messagebox.Show("The message"); } }); 没有任何错误发生. ,我还有另一项工作要在后台完成,并且通过按钮单击来调用它,例如 private void button3_Click(object sender, EventArgs e) { var task = new Task(() => { DoWork(); Messagebox.Show("Done"); }); _task.Start(); } a System.Reflection.TargetInvocationException显示MessageBox. 我也尝试
8 2024-04-26
编程技术问答社区
接收多个不同的消息 TcpListener C#
嗨,我一直在尝试学习如何使用TCPLISTENER和套接字在客户端服务器之间发送一些简单的短信.我已经阅读了许多似乎正在显示如何读取_ buffer的线程,以确保循环以确保读取整个消息.但是,我似乎无法弄清楚如何在收到第一条消息之后获得第二个消息.我可以很好地连接到服务器,我可以收到第一条消息.但是,如果我再次点击客户端上的"发送"按钮,则没有消息到服务器.这是我的代码: // SERVER APPLICATION: ----------------------------------------------- namespace TCP_Server { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnStartServer_Click(
12 2024-04-26
编程技术问答社区
流程结束前未完成的任务
在主线程中的代码中,我称为第三方API.对于API的每个结果,我称之为2个异步任务.有时所有工作都可以完美,有时并非所有异步任务都运行.我想,当主线程完成时,垃圾收集器杀死了我在后台运行的所有其他任务.有什么办法告诉垃圾收集者在主线程完成时不要杀死背景服务? 代码是这样的: for (int i = 0; i { DoSomething1(guid); }); } pu
2 2024-04-26
编程技术问答社区
将新的线程注册到已经定义的屏障上
有没有办法将线程添加到已经预定的屏障? 场景:我在某些时间点n线程,代码声明Barrier以处理它们. 问题是,有时我可能需要在该障碍实例中处理另一个新线程,但是仅使用N线程声明了障碍. 示例: barrier = new Barrier(N, (sprint) => { Console.WriteLine($"Current sprint: {sprint.CurrentPhaseNumber}") }); 声明后,我需要用n+1个线程以某种方式再次更新它,任何建议? 解决方案 屏障上的完整文档在这里: https:https:https:https:https:https:https:https:https://learn.microsoft.com/en-us/dotnet/standard/threading/barrier 简而言之,您可以随时通过分别致电AddParticipant或RemoveParticipant.
6 2024-04-26
编程技术问答社区
应用程序.运行() 导致程序挂起
我的程序中有一些链接,我必须在Web浏览器中打开链接,然后在网页中输入一些数据. GUI线程中提供了链接列表.但是我需要在主线程外的链接上进行一些工作,以避免滞后和悬挂GUI.我需要一个接一个地打开链接.我的意思是,如果线程开始工作,则仅在线程完成工作时才启动下一个线程. 链接列表的另一个重要一件事是,当创建线程并正常工作时,链接列表正在更新. 所以我创建了一个工作线程,该线程管理另一个线程. 我有两个AutoResetEvents,一个用于检查空是否为空的列表(postInQueue).如果列表为空,则等待链接将添加到列表并调用postInQueue.set(). 第二个是螺纹,当线程开始工作时,它正在等到线程调用threadInProgress.set(); AutoResetEvent threadInProgress = new AutoResetEvent(False); AutoResetEvent postInQueue = new Au
4 2024-04-26
编程技术问答社区
OnEvent数据网格列添加失败
我有一个datagrid.我想添加事件的结果. 所以我做 for (int iii = 1; iii { dtgResults.Columns.Add(dtgColumn); })); } 但是,尽管使用了调度员,但我得到了此错误: 呼叫线程无法访问此对象,因为一个不同的线程拥有它. 谢谢您的任何帮助 帕特里克 } 解决方案 它看起来像是一个问题,而不是UI控制本身,而是创建的dtgColumn对象.您在一个线程上创建UI元素,然后将其添加到主线程上的UI元素中. 更改您的代码: Dispatcher.Invoke((Action)(() => { var dtgColumn = n
10 2024-04-26
编程技术问答社区
C#-Task.WaitAll()不是在等待所有的任务完成
我正在使用C#代码将XML发送到API终点并捕获响应 我的方式如下 我的文件夹A具有100 XML,具有100 XML的文件夹B和100 XMLS 的文件夹C i循环遍历每个文件夹,在每个循环迭代中,我创建了一个任务.让我们称之为文件夹任务 文件夹任务循环通过每个文件夹中的所有XML,并捕获响应.这是在sendrequestandcaptureresponse()方法 中完成的 我面临的问题是在处理所有XML之前的循环结束.对于所有300个XML(在文件夹A,B和C中)触发了SendRequestAndCapturerSponse()方法,但我仅获得150(大约)XMLS 的响应 task.waitall(taskList)在等待所有XML响应之前退出 请找到下面的代码 代码通过文件夹迭代 foreach(Folder in Folders){ Task t=Task.Factory.StartNew(
14 2024-04-26
编程技术问答社区