Tag: multithreading

为什么使用System.Threading.Thread.Sleep()是一种不好的做法?

我正在编写一个应用程序,通过一个复杂的API处理一个庞大而丑陋的第三方系统。 有时系统会发生一些错误,但如果我们等待我的程序面对这些错误,那就太晚了。 所以,我使用一个单独的线程来检查系统状态如下: while (true) { ask_state(); check_state(); System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1)); } 如果我在100毫秒或每分钟检查一次系统状态并不重要。 但我听说使用Thread.Sleep()是一种不好的做法。 为什么? 在这种情况下我该怎么办?

用自定义构建的C#替换C#中的任务调度程序

我想知道我是否可以使用C#更改将任务映射到.NET中的实际操作系统线程的任务调度程序,或者如果我需要重新编译,比如Mono运行时执行此操作。 谢谢。

SQL Server CLR线程

我一直在努力使用SQL Server CLR存储过程。 背景: 我们正在使用SQL Server 2014,并且已经实现了一个调用客户Web服务的CLR存储过程。 最初使用线程不会减慢SQL Server CLR的主线程。 虽然,现在,我知道在CLR下使用线程并不是最好的主意,但它已经正常工作了6年(自SQL Server 2008以来)。 它最近已迁移到SQL Server 2014。 问题 在我的开发机器上,与测试系统一样,我们对解决方案没有任何问题。 在客户系统上,调用Web服务的线程由于某种原因从不执行。 我可以从日志文件中看到一切正常,直到线程执行。 没有特定的错误,没有。 我们一直在尝试更改权限,但没有成功。 因此,我认为这不是一个许可问题。 问题 有谁知道如何改变这种行为? 我们找不到任何可能起作用的配置。 完全删除线程,并直接在SQL Server主线程上调用Web服务是不是一个好主意? 谢谢你的任何建议,彼得

ReaderWriterLockSlim.EnterUpgradeableReadLock()始终是死锁?

我对ReaderWriterLockSlim非常熟悉,但我最近尝试在类中实现了EnterUpgradeableReadLock() …很快我意识到当2个或更multithreading运行代码时,这几乎肯定是一个保证死锁: Thread A –> enter upgradeable read lock Thread B –> enter upgradeable read lock Thread A –> tries to enter write lock, blocks for B to leave read Thread B –> tries to enter write lock, blocks for A to leave read Thread A –> waiting for B to exit read lock Thread […]

这个非锁定的TryGetValue()字典是否可以访问线程安全?

private object lockObj = new object(); private Dictionary dict = new Dictionary(); public string GetOrAddFromDict(int key) { string value; // non-locked access: if (dict.TryGetValue(key, out value)) return value; lock (this.lockObj) { if (dict.TryGetValue(key, out value)) return value; string newValue = “value of ” + key; // place long operation here dict.Add(key, newValue); return newValue; } […]

C#秒表显示错误的时间

我看过其他用户post显示秒表测量在“Thread.Sleep(5000)”中花费的时间约为5000毫秒。 但是我的程序会产生以下结果 for (int i = 0; i < 20; ++i) { Stopwatch sw = Stopwatch.StartNew(); DateTime start = DateTime.Now; Thread.Sleep(5000); sw.Stop(); Console.Out.WriteLine( "StopWatch Diff:" + sw.ElapsedMilliseconds.ToString()); Console.Out.WriteLine( "DateTime Diff:" + DateTime.Now.Subtract(start).TotalMilliseconds.ToString()); } 秒表差异:1684 DateTime Diff:5262.592 秒表差异:1625 DateTime Diff:4997.12 秒表差异:1604 DateTime Diff:4997.12 秒表差异:1601 DateTime Diff:4997.12 秒表差异:1690 DateTime Diff:4997.12 秒表差异:1603 只是我在观察这种行为吗? 为什么秒表在实际经过5秒后测量为1.6秒。 这是线程实际运行的时间?

有没有办法唤醒睡眠线程?

有没有办法在C#中唤醒一个睡眠线程? 那么,让它睡了很长时间并在你想要处理工作时将其唤醒?

带参数的Dispatch.Invoke(new Action …)

以前我有过 Dispatcher.Invoke(new Action(() => colorManager.Update())); 从另一个线程更新显示到WPF。 由于设计,我不得不改变程序,我必须将ColorImageFrame参数传递给我的ColorStreamManager.Update()方法。 点击此链接后,我将调度程序修改为: Dispatcher.Invoke(new Action((p,v) => p.Update(v))); 它编译得很好但根本不会运行。 VS2010说“参数计数不匹配”。 在我的ColorStreamManager.Update()方法中,我有RaisePropertyChanged(() => Bitmap) ; 有人可以指出我哪里出错了吗? ColorStreamManager.Update()方法的签名如下: public void Update(ColorImageFrame frame);

如何同时异步进行多次ping操作?

我似乎无法理解如何构建对SendPingAsync的异步调用。 我想循环遍历一个IP地址列表,并在继续执行程序之前异步ping它们…现在需要一次一个地遍历所有这些地址。 我之前问了一个关于它的问题,我认为我能够找出异步,但显然我错了。 private void button1_Click(object sender, EventArgs e) { this.PingLoop(); MessageBox.Show(“hi”); //for testing } public async void PingLoop() { Task longRunningTask = PingAsync(); int result = await longRunningTask; MessageBox.Show(“async call is finished!”); //eventually want to loop here but for now just want to understand how this works } private async Task PingAsync() { Ping […]

C# – Parallel.Invoke和Parallel.ForEach本质上是一回事吗?

并且通过“同样的事情”我的意思是这两个操作基本上做同样的工作,它只是归结为哪个更方便根据你必须使用的工作进行调用? (即代表列表或迭代的事项列表)? 我一直在搜索MSDN,StackOverflow和各种随机文章,但我还没有找到一个明确的答案。 编辑: 我应该更清楚; 我问这两种方法是否做同样的事情,因为如果他们不这样做,我想了解哪种方法会更有效率。 示例:我有500个键值的列表。 目前我使用foreach循环遍历列表(连续)并执行每个项目的工作。 如果我想利用多个内核,我应该简单地使用Parallel.ForEach吗? 让我们说为了参数的缘故,我为这500个任务提供了500个代表的数组 – 是否会产生任何不同的调用Parallel.Invoke,给它一个500个代表的列表? 提前谢谢了!