Tag: multithreading

线程和SqlFileStream。 该进程无法访问指定的文件,因为它已在另一个事务中打开

我正在提取SQL文件表中的文件的内容。 如果我不使用Parallel,以下代码可以正常工作。 我同时读取sql文件流(并行)时遇到以下exception。 该进程无法访问指定的文件,因为它已在另一个事务中打开。 TL; DR: 在Parallel.ForEach中从FileTable读取文件(使用GET_FILESTREAM_TRANSACTION_CONTEXT)时,我得到上述exception。 示例代码供您试用: https://gist.github.com/NerdPad/6d9b399f2f5f5e5c6519 更长版本: 获取附件,并提取内容: var documents = new List(); using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { var attachments = await dao.GetAttachmentsAsync(); // Extract the content simultaneously // documents = attachments.ToDbDocuments().ToList(); // This works Parallel.ForEach(attachments, a => documents.Add(a.ToDbDocument())); // this doesn’t ts.Complete(); } DAO读取文件表: public async Task<IEnumerable> GetAttachmentsAsync() { […]

是否在后台工作者调用之间保留了线程本地存储?

后台工作线程是否重复使用? 具体来说,如果我在后台工作者的DoWork()方法期间设置了一个命名数据槽(线程本地存储),那么该数据槽的值是否会持续存在,以后可能会发现某个其他线程? 我不会这么想,但我有这个错误…… 编辑: 这篇博文建议BackGroundWorker使用ThreadPool ,这意味着线程被重用。 所以问题就变成了; 重用线程是否可能在调用之间持久保存线程本地存储?

如何在特定时间间隔后运行方法?

很明显:例如,想象一下我的表格中的一个按钮。 当用户单击该按钮时,某些void方法应在30秒后运行。 会有一个DoAfterDelay两个输入参数的void方法DoAfterDelay 。 第一个是要做的方法(使用委托),另一个是时间间隔。 所以我会: public delegate void IVoidDelegate(); static void DoAfterDelay(IVoidDelegate TheMethod, TimeSpan Interval) { // *** Some code that will pause the process for “Interval”. TheMethod(); } 所以,我只需要一段代码来暂停特定时间间隔的过程。 到目前为止,我使用此代码执行此操作: System.Threading.Thread.Sleep(Interval); 但是这段代码对我没有好处,因为它会停止整个过程并冻结程序。 我不希望程序卡在DoAfterDelay方法中。 这就是Thread.Sleep没用的原因。 所以有人可以提出更好的方法吗? 当然我已经搜索过了,但我发现的大部分解决方案都是基于使用计时器(比如这里 )。 但是使用计时器是我最后的意见,因为该方法应该运行一次并且使用计时器会使程序混淆阅读。 所以,如果有的话,我正在寻找更好的解决方案。 或许我必须使用计时器? 我想我必须玩线程,但不确定。 所以我想知道是否有人可以指导我找到解决方案。 提前致谢。

使用Interlocked进行线程安全的DateTime更新。*

我可以使用Interlocked。*同步方法来更新DateTime变量吗? 我希望在内存中保留最后触摸时间戳。 多个http线程将更新最后一次触摸DateTime变量。 我很欣赏DateTime变量是被替换而不是更新的值类型。 我能想到的最好的方法是将时间戳保持为长整数 class x { long _lastHit; void Touch() { Interlocked.Exchange( ref _lastHit, DateTime.Now.Ticks ); } }

在.NET中是否存在用于长时间运行线程的线程调度程序?

我们的场景是网络扫描仪。 它连接到一组主机并使用低优先级后台线程并行扫描它们一段时间。 我希望能够安排大量工作,但只有任何给定的说十个或同时扫描的任何数量的主机。 即使我创建自己的线程,许多回调和其他异步善良使用ThreadPool,我最终耗尽资源。 我应该看一下MonoTorrent …… 如果我使用ThreadPool,我可以将我的应用程序限制为某个数字,这些数字将足以让应用程序的其余部分顺利运行吗? 是否有一个线程池,我可以初始化为n长寿线程? [编辑]似乎没有人注意到我对一些回复做了一些评论,所以我会在这里添加一些东西。 线程应该可以优雅和有力地取消。 线程应具有低优先级,使GUI响应。 线程长时间运行,但是按顺序(分钟)而不是订单(天)。 针对给定目标主机的工作基本上是: For each test Probe target (work is done mostly on the target end of an SSH connection) Compare probe result to expected result (work is done on engine machine) Prepare results for host 有人可以解释为什么使用SmartThreadPool标记有消极的用处吗?

C#threading – 锁定对象

我想在ac#app中锁定一个“盒装”对象,这不可能吗? class t { System.Object t_x = new object(); public t(int p) { t_x = p; } public void w() { lock (t_x) { for (int i = 0; i < 4; i++) { { t_x = ((int)t_x) + 1; Console.WriteLine(t_x); Thread.Sleep(1000); } } } } } 在另一个类中,我可以开始2个线程: Thread b1 = new Thread(new ThreadStart(t1.w)); b1.Start(); […]

为什么后台线程中未处理的exception不会导致应用程序域崩溃?

我完全不解。 如果在我从未测试过的线程中有未捕获的exception,我非常确定.NET会关闭整个应用程序域。 但是我只是尝试了下面的代码并且它没有失败…任何人都可以解释为什么? (在.NET 4和3.5中尝试过) static void Main(string[] args) { Console.WriteLine(“Main thread {0}”, Thread.CurrentThread.ManagedThreadId); Action a = new Action(() => { Console.WriteLine(“Background thread {0}”, Thread.CurrentThread.ManagedThreadId); throw new ApplicationException(“test exception”); }); a.BeginInvoke(null, null); Console.ReadLine(); }

C#:如何暂停线程并在某些事件发生时继续?

如何暂停线程并在某些事件发生时继续? 我希望当按钮单击时线程继续。 有人告诉说thread.suspend不是暂停线程的正确方法。 那另一个解决方案

c#锁定传递给方法的引用 – 不好的做法?

我有一个类似的方法: public static void DoSomething (string param1, string param2, SomeObject o) { //….. lock(o) { o.Things.Add(param1); o.Update(); // etc…. } } 几点: 用这种方式锁定不好的做法? 我应该锁定private static object吗? 如果是这样,为什么?

我是否需要将线程访问同步到int?

我刚刚编写了一个由多个线程同时调用的方法,我需要跟踪所有线程何时完成。 代码使用这种模式: private void RunReport() { _reportsRunning++; try { //code to run the report } finally { _reportsRunning–; } } 这是代码中唯一一个_reportsRunning的值被更改的地方,该方法需要大约一秒钟才能运行。 偶尔当我有超过六个左右的线程一起运行报告时,_reportsRunning的最终结果可以降到-1。 如果我在锁中包含对_runningReports++和_runningReports–的调用,那么该行为似乎是正确且一致的。 所以,问题是:当我在C ++中学习multithreading时,我被教导你不需要同步调用递增和递减操作,因为它们总是一个汇编指令,因此线程不可能在中间切换-呼叫。 我是否正确地教过,如果是这样,那对C#来说怎么回事?