饲养员应用的多线程架构
这是我在这里的第一篇文章,所以如果结构不好,则很抱歉. 我们已被任命设计一种将: 的工具 读取(帐户ID)的文件,CSV格式 从网络下载每个帐户的帐户数据文件(通过ID)(REST API) 将文件传递给将产生报告(财务预测等)的转换器[〜20ms] 如果预测阈值在限制范围内,请运行解析器以分析数据[400ms] 生成了以上分析的报告[80ms] 将生成的所有文件上传到Web(REST API) 现在,所有这些要点都相对容易.我有兴趣找出如何最好地构建某些东西来处理此问题,并在我们的硬件上快速有效地做到这一点. 我们必须处理约200万个帐户.方括号给出一个平均每个过程需要多长时间的想法.我想使用机器上可用的最大资源-24 Core Xeon处理器.这不是记忆密集型过程. 使用TPL并将每个任务作为任务创建是个好主意吗?每个都必须依次发生,但可以一次完成许多.不幸的是,解析器没有多线程意识,我们没有来源(这本质上是黑匣子的). 我的想法就是这样
174 2024-04-26
编程技术问答社区
用TPL和/或BackgroundWorker处理间歇性的IO作业
我有一个与一些串行和USB设备进行交互的C#应用​​程序.我正在尝试找到一种以平行方式命令这些设备的好方法,以便可以一次控制许多设备.我将通过用户输入和脚本命令启动命令. 我目前正在尝试找出一种干净的方法来"收集"并平行于我的UI线程运行命令.我有多个表格,一种用于每个设备,每个都有一些可以发出命令的控件. 我目前看到的方式将单击一个按钮,该按钮将以表格启动事件.另一个类使它称为CommandManager将涉足所有这些事件.每个事件都通过必要的信息来形成命令以发送到设备. 当事件由CommandManager处理时,它构成命令并将其添加到BlockingCollection中,在命名DeviceCommandWorker的子分类DeviceCommandWorker中,该> DeviceCommandWorker是在应用程序打开时启动的.它所做的就是循环在包含Task.Factory.StartNew()调用的代码块上. 在StartNew块中
10 2024-04-26
编程技术问答社区
如何使用C# Parallel.For与线程本地存储参考类型
我正在寻找有关如何在C#中使用参考类型在C#中使用的示例.我曾经通过MSDN文档,我能找到的只是使用值类型用于线程本地存储的示例.我正在尝试的代码如下: public string[] BuildStrings(IEnumerable str1, IEnumerable str2, IEnumerable str3) { // This method aggregates the strings in each of the collections and returns the combined set of strings. For example: // str1 = "A1", "B1", "C1" // str2 = "A2", "B2", "C2" // str3 = "A3", "B3", "C3" // // Should return: // "A1 A2 A
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(
16 2024-04-26
编程技术问答社区
PLINQ查询,需要知道进行了多少次迭代
我基本上要做的是在一系列字母组合上并行迭代,当我获得组合时,我希望它被认为是胜利.我想从此查询中获得所有胜利(它做得正确),但是诀窍是如何跟踪执行胜利测试的次数(基本上是返回true/false的方法, ). 我正在在类中创建一个实例变量,每次执行组合上的测试时都会增加,但是每次运行过程时,我都会为此实例变量获得不同的数字.我意识到这是一个线程问题,但我不确定如何解决. 赢的数量有一个最大限制,即击中查询需要停止.如果我没有这种约束,我就不需要知道连击的次数,因为它会运行所有连击,但是如您所见,当我达到最大值时,我需要突破查询限制. public Results GetWinResults() { ParallelQuery winningCombos = from n in _nextCombination.GetNextCombo().AsParallel()
6 2024-04-26
编程技术问答社区
在windows phone中不能等待'void'错误
我陷入了这个问题.我正在创建Windows Phone应用程序.这是代码. private async void btn_signup_Click(object sender, RoutedEventArgs e) { obj = new ServiceReference2.Service1Client(); if (!txt_id.Text.Equals("") && !txt_name.Text.Equals("") && !txt_password.Equals("")) { user r = new user(); r.ID = txt_id.Text; r.FULLNAME = txt_name.Text; r.PASSWORD = txt_password.Text; var g = await obj.GetDataAsync(r); string
6 2024-04-26
编程技术问答社区
用.NET 4.5和c#进行基于任务的处理,并限制并发任务数
跟随发布针对以下任务的准则解决方案,针对.NET 4.5(和更大的WPF UI)? 基本上,我正在寻找一个在.NET 4.5和C#上实现的洪流应用程序的功能类似物. 任务: i具有IEnumerable,包含1000个实例IProcessable,IProcessable具有Process(int argument)方法,从1到10秒钟才能执行.我想循环浏览集合并处理IProcessable的每个实例,将同时处理的实例的数量限制为n(1..10),最大并发实例的数量应易于调节.理想情况下,我每个IProcessable要报告过程完成的进度,这是过程的原型(可能需要转换为某些东西而不是无效以启用进度报告): void Process(int e) { int progress = 0; ...Sleep for 100ms; int progress = 30; ...Sleep for 100ms; int
12 2024-04-26
编程技术问答社区
如何以正确的方式完成一个频道?如何使用多个渠道?
我有一个数据列表,要创建与列表中元素数量相对应的任务数.但是我不知道如何正确完成频道. 我的代码,但是频道并没有像我期望的那样关闭. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Channels; using System.Threading.Tasks; namespace Ding.LearningNewThings { public class MultipleChannel { public static async Task RunMiltipleChannel() { List listPlace = Place.InitData(); Channel _dat
18 2024-04-26
编程技术问答社区
我怎样才能使其异步运行?
我在C#中编写了WPF应用程序,在其中我需要在TFS中查询历史记录,并且我正在显示我在listView中获得的更改列表. listView itemssource绑定到一个名为更改集的iEnumerable属性,该属性在使用该属性之前未加载: public IEnumerable Changesets { get { if (p_nChangesets == null) { p_nChangesets = TfsHelper.VCS.QueryHistory(Path, VersionSpec.Latest, 0, RecursionType.Full, null, new ChangesetVersionSpec(1),
16 2024-04-26
编程技术问答社区
在Flurl.Http DownloadFileAsync / HttpClient GetAsync中,为什么任务取消需要这么长时间?
写一堂课以并行从服务器下载图像时(使用 dataflow tpl 库),使用ActionBlock和 Flurl.Http 设施方法DownloadFileAsync,我已经意识到取消花费了很多时间.由于所有下载操作共享CancellationToken,因此我希望所有任务都会立即取消(或几乎).实际上,如果我产生大量并行下载,则取消所有任务/线程可能需要几分钟.我已经通过将ExecutionDataflowBlockOptions.MaxDegreeOfParallelism属性设置为10来解决该问题.这样,在任何给定时间,最多将有10个并发下载(仍然不是我期望的那样立即采取行动). 我已经创建了一个控制台.NET 5程序,该程序将隔离地重现问题(没有DataFlow TPL,ActionBlock等).首先要询问并发下载的数量(按默认值输入:为100个下载).然后,它使用Flurl.Http(使用HttpClient)并行产生所有这些下载,然后将A CancellationTo
在两个物体集合之间进行有争议的平行工作
我正在尝试在两个集合之间进行模拟和并行模拟两个集合之间的工作,我有一个客户和工人的集合.我需要工人从队列中带走客户的客户,并立即完成另一个客户. 我决定使用基于事件的范例,工人收集将对客户进行诉讼;谁拥有一个事件处理程序,该活动在客户完成后会开火;希望它能再次启动Dowork方法,这样,我可以平行地将工人从队列中带走顾客.但是我不知道如何将客户带入oncustomerfined()!工人不应依靠客户的队列 public class Worker { public async Task DoWork(ConcurrentQueue cust) { await Task.Run(() => { if (cust.TryDequeue(out Customer temp)) { Task.Delay(5000);
如何在C#中重复使用一个线程
我想知道如何重复使用线程.我有一个Websocket连接,该连接不断发送需要进行一些计算的消息.我想将此计算添加到线程中,但不想每次都创建一个新线程.我该如何重复使用该线程? client.MsgRecieved.Subscribe(info => { Thread t = new Thread(() => Do_work(info)); }; 有没有一种方法可以创建线程,命名,然后在该线程上添加Do_work()? 编辑: 我每秒从Websocket获取多个消息.我宁愿让他们在一个队列中等待,而不是全部在新线程上运行. 解决方案 最简单的模式是 client.MsgRecieved.Subscribe(async info =>{ await Task.Run(Do_work(info)); }); 排队在内置螺纹池上运行的方法. 如果要排队在单个背景线程上运行的消息,则可以使用BlockingCollection,例如:
6 2024-04-26
编程技术问答社区
简单的异步操作与延续场景在WPF应用中不工作
我在WPF应用程序上有一个非常简单的操作,以便尝试异步操作.这是我的完整代码: static int GetPrimes() { var query = from n in Enumerable.Range(3, 5000000).AsParallel() where Enumerable.Range(2, (int)Math.Sqrt(n)).All(i => n % i > 0) select n; return query.Count(); } private void button1_Click(object sender, RoutedEventArgs e) { Task task = Task.Factory.StartNew( () => GetPrimes(), TaskCreationOptions.LongRunning );
4 2024-04-26
编程技术问答社区
如何强制任务在STA线程上运行?
我有一个winforms应用程序,我想使用Windows.Forms.OpenFileDialog,它需要一个sta线程.线程可以正常工作,但是任务呢? 相关的问题,但没有在那里找到解决方案:如何创建运行sta线程的任务(tpl)? 这是我要实现的目标的一个示例(主要尝试了上述相关问题中的工作): public async Task TestFileDialogAsync() { string outFile = "no file"; await Task.Factory.StartNew(() => { Console.WriteLine($"Thread apartment: {Thread.CurrentThread.ApartmentState}"); // prints MTA try { using (OpenFileDi
6 2024-04-26
编程技术问答社区
在调用 "等待 "之前,访问任务上的 "结果 "究竟有什么作用?
var task = Task.Run(() => DoSomeStuff()).Result; 引擎盖下发生了什么? 我做了一个很小的测试: using System; using System.Threading.Tasks; public class Program { public static void Main() { var r = Task.Run( () => {Thread.Sleep(5000); return 123; }).Result; Console.WriteLine(r); } } 5秒后打印" 123".因此 以前我的代码称为Task.Delay(5000),它立即返回" 123".我在问题中解决了这个问题,但请在这里作为评论和回答引用它. 解决方案 那么,Task上访问任何此类属性是否充当调用Task.Wait()? 的快捷方式 是. 来自 访问
6 2024-04-26
编程技术问答社区
如何并行地执行任务,但每T秒不超过N个任务?
我需要尽可能快地并行运行许多任务.但是,如果我的程序每1秒执行30多个任务,则将被阻止.如何确保每个1秒间隔不超过30个? 换句话说,如果在最后一秒钟内完成了30个任务,我们必须防止新任务开始. 我丑陋的解决方案: private async Task Process(List taskList, int maxIntervalCount, int timeIntervalSeconds) { var timeList = new List(); var sem = new Semaphore(maxIntervalCount, maxIntervalCount); var tasksToRun = taskList.Select(async task => { do { sem.WaitOne(); } while
8 2024-04-26
编程技术问答社区
使用Polly通过200 ms等待异步方法重试
我正在尝试使用Polly进行以下操作.我有一个ExecuteTask异步方法,我想用200 ms等待进行有条件的重试.这就是我到目前为止的: 策略 AsyncRetryPolicy retryPolicy = AsyncPolicy .HandleResult(s => s.IsCorrect == false) .WaitAndRetry(1, sleepDurationProvider: (retryCount, status, ctx) => { return TimeSpan.FromMilliseconds(200); }, onRetry: (response, timeSpan, retryCount, ctx) => { Console.WriteLine($"Received a response of {response.Resu
26 2024-04-26
编程技术问答社区
异步中止C# TPL任务
有没有一种方法可以异步流产使用Task.Factory.Create(() => {stuff});创建的C#tpl任务?我已经看到有一种使用CancellationToken进行操作的方法,但我想避免使用IsCancellationRequested. 检查 解决方案 编辑:更新了.net 4.5及更新的详细信息. CancellationToken是 您要使用的东西.检查IsCancellationRequested可能看起来像痛苦,但它提供了一种处理取消的干净方法,而不是创建线程,然后流产并不得不处理并行运行的整个代码中的线程中止的异常. var cts = new CancellationTokenSource(); var token = cts.Token; var task = Task.Run(() => { // Do Job Step 1... if (token.IsCancellationRequested) {
2 2024-04-25
编程技术问答社区
单一源生产商与并行工作的多个求职者
我想有一种队列,其中单个源在其中输入数据,而在另一端,消费者将在等待时,当他们检测到队列不是空的,直到他们停止之前就开始执行数据.但是,重要的是,如果排空队列,他们仍然会继续观看队列,以便如果更多的数据弹出,它们将能够消耗它.我发现的内容是将是消费者和生产者并联的 Parallel.Invoke(() => producer(), () => consumers()); 问题是我将如何执行队列的内容,该内容有时在并行中为空 解决方案 您可以使用您可以将其用作队列,然后将其引用到producer(),并且每个consumers(). 您将致电生产者线程将在集合中添加项目,并将致电这是一个基本示例(没有错误处理).对Thread.Sleep()的调用是为了模拟负载,不应在实际代码中使用. using System; using System.Collections.Concurrent; using System.Threading; using System.
6 2024-04-25
编程技术问答社区