Tag: multithreading

在哪里停止使用async / await关键字?

我的DB2 / 400有一个简单的心跳方法: public bool CheckConnection() { try { using (OleDbConnection db = new OleDbConnection( this.conString )) { OleDbCommand cmd = new OleDbCommand(); cmd.CommandText = “select 1 from sysibm.sysdummy1”; cmd.Connection = db; db.Open(); cmd.ExecuteReader(); db.Close(); return true; } } catch (Exception) { return false; } } 我希望在我的应用程序运行时使用它,当然我不想执行表单的其余部分。 我的主要方法是: public FrmMain() { InitializeComponent(); PrepareFormTexts(); PrepareFormData(); PrepareStateClass(); […]

我如何获得bulletphics / bulletsharps的multithreading工作?

也就是说,设置BulletSharp物理引擎包装器“DynamicsWorld”以使用“BulletSharp.MultiThreaded.ParallelConstraintSolver”所需的最小代码集是多少? 或者,我可以从BulletPhysics引擎本身的相同代码集中解决它。 如果我没有说出正确的问题,我希望得到澄清; 我今天才开始使用它。 (是的,我已经使用标准类编写了一个快速程序)。 BulletPhysics是一个C ++库; 包装器是用C#编写的。 http://bulletphysics.org/wordpress/ http://code.google.com/p/bulletsharp/ 谢谢。

自定义TaskScheduler,SynchronizationContext?

async等待演员内部的支持 我将演员lib Akka移植到.NET( https://github.com/rogeralsing/Pigeon )我想在我的演员中添加async / await支持。 这给了我一些问题,因为如果我使用默认调度程序,await continuation将运行与actor并发boundarys相关。 这意味着,当actor处理消息时,可以继续运行,因为这将导致两个线程同时访问actor内部状态。 如果我能以某种方式将任务安排到演员自己的邮箱,并在邮箱运行中完成任务,这将解决问题。 public class SomeActor : UntypedActor { protected override OnReceive(object message) { if (message is SomeMessage) { DoAsyncStuff(); } } private async void DoAsyncStuff() { var res = await something.. //this code will not respect the actor concurrency boundary //since it can run at the […]

将事务范围添加到Parallel.Foreach

我有一个循环将记录插入数据库(Firebird): using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options)) { taskList.Add(Task.Factory.StartNew(() => { Parallel.ForEach(objectList, c => { DoInsert(c, id); }); })); scope.Complete() } 如果插入失败,我希望能够批量回滚这些插入。 但是,当我在Parallel.Foreach循环中执行插入时,事务范围不可见。 我假设那是因为循环在不同的线程中运行。 如果我使用TransactionScope作为串行插入执行此操作,一切正常。 我试图使用DependentTransaction但我似乎无法获取DoInsert函数的上下文。 DoInsert只是打开一个连接并将C的内容写入数据库。 有任何想法吗? 谢谢,

Monitor.TryEnter / Monitor.Exit和SynchronizationLockException

是否有可能检测到同一个线程是否试图释放锁定? 我们在代码中有很多地方看起来像: try { try { if(!Monitor.TryEnter(obj, 2000)) { throw new Exception(“can not lock”); } } finally { Monitor.Exit(obj); } } catch { //Log } 上面的代码非常简化,实际上Enter和Exit语句位于自定义对象(lock manager)中。 问题是,在该结构中,我们在尝试“退出”时有SynchronizationLockException ,因为它看起来像是没有成功锁定的线程,试图最终释放。 所以问题是,我怎么知道创建Monitor.Exit的线程是否与Monitor.Enter的线程相同? 我以为我可以使用CurrentThread.Id同步进入和退出,但我不确定它是否“足够安全”。

如何处理长AJAX请求 – 发送响应但继续工作

我们使用jquery-ajax将指令集从浏览器发送到多层Web应用程序。 第一个组件(组件A,用C#编写)validation并将指令持久存储到数据库中,然后调用第二个组件(组件B,用Java编写,也通过HTTP调用),该组件在从指令中检索后对指令进行操作数据库。 浏览器客户端在提交作业后只通过组件A轮询rdbms表,因此在发送请求后它实际上已断开连接,并且不等待组件A的响应。 中间层(组件A)将成功消息返回给客户端以确认成功提交任务的最佳方式是什么,但仍然向请求处理程序(组件B)发出请求并释放其所有资源? 返回响应是页面的最终操作,因此在将其发送回浏览器之前,我们必须在另一个线程中执行某些操作。 我们考虑的另一个选择是在组件B中发生这种情况,其中任务处理程序向中间层发送回立即响应以确认请求,但随后继续在后台工作。 唯一的区别是我们产生额外线程来完成工作。 关于如何处理这个问题的任何好主意?

除了通过调用thread.Join()之外,我怎么能等待一个线程完成运行?

我正在开发一个项目,其中从库中可用的应用程序调用方法。 我在按钮点击事件中有以下代码: Thread thread = new Thread(new ThreadStart(AddPics)); thread.Priority = ThreadPriority.Highest; thread.Start(); execute(); 但是在运行示例时,执行点总是会移动到执行。 如何使程序首先执行AddPics方法。 我已经尝试过thread.Join()并且它有效,但我想知道是否还有其他方法可以实现这一点。

为什么C#Parallel.Invoke很慢?

我这样做: private static void Main(string[] args) { var dict1 = new Dictionary(); var dict2 = new Dictionary(); DateTime t1 = DateTime.Now; for (int i = 1; i dict1.Add(i, “Test” + i), () => dict2.Add(i, “Test” + i) ); } TimeSpan t2 = DateTime.Now.Subtract(t1); Console.WriteLine(t2.TotalMilliseconds); Console.ReadLine(); } 所以做一个100万次循环并将项目添加到两个不同的词典。 问题是需要11秒,这比普通顺序方法(没有任务/线程)多5倍,仅需2秒。 不知道为什么。

WinFormsmultithreading:仅在前一个更新完成后才执行GUI更新

我有multithreading应用程序和一些后台处理。 它具有长时间运行的UI更新 (在UI线程本身上),它们通过MSDN上的知名资源从后台线程调用。 我无法缩短这些UI更新,因为它们最终在外部库中完成(1)。 现在,从该后台线程, 我想在UI线程上异步调用(使用BeginInvoke() )这些更新,但前提是尚未完成上一次更新。 如果没有,我想简单地跳过此更新。 这将防止Windows消息队列溢出,以防调用比调用方法能够执行的速度快。 我目前的解决方案是:在UI线程上执行的方法中,我进入并退出ReaderWriterLockSlim实例。 在后台线程上,我尝试以零超时进入实例。 成功后,我调用’BeginInvoke()’然后再次退出。 如果不成功,我会完全跳过方法调用。 public void Update(double x, double y) { _updateLock.EnterWriteLock(); try { //…long running task… } finally { _updateLock.ExitWriteLock(); } } //…. void Provider_PositionChanged(object sender, SpecialEventArgs e) { if (_updateLock.TryEnterWriteLock(0)) //noone is currently executing an update? { try { myUiControl.BeginInvoke(/*…*/); } finally { _updateLock.ExitWriteLock(); […]

切换到WPF中的调度程序线程

这是本课题的后续行动。 我必须从不同的Thread更新ObservableCollection。 我尝试使用以下代码: Thread t = new Thread( ()=> { while(true) { if (ErrorDetection.ErrorDetectionIO.doErrorDetection() == 1) { dataLine = ErrorDetection.ErrorDetectionIO.getDataLine(); if (mainWindow != null) { ISynchronizeInvoke target = mainWindow; // mainWindow needs to be an WindowsForm? target.Invoke( (Action)(() => { mainWindow.setNewDataLine(dataLine); } ), null); } } } } ); t.IsBackground = true; t.Start(); ErrorDetectionIO.doErrorDetection()在c ++ […]