Tag: multithreading

线程内存泄漏

我试图在更大的C#程序中追踪内存泄漏,该程序产生多个线程。 在这个过程中,我创建了一个小方程序,我用它来测试一些基本的东西,我发现了一些我真的不明白的行为。 class Program { static void test() { } static void Main(string[] args) { while (true) { Thread test_thread = new Thread(() => test()); test_thread.Start(); Thread.Sleep(20); } } } 运行这个程序,我看到程序的内存使用量稳步增加而不会停止。 在短短几分钟内,内存使用量超过100MB并继续攀升。 如果我注释掉test_thread.Start();行,那么程序使用的内存最大可以达到几兆字节,并且会升级。 我还尝试使用GC.Collect()在while循环结束时强制进行垃圾收集,但它似乎没有做任何事情。 我认为一旦函数完成执行允许GC将其拖拽,线程就会被取消引用,但这似乎并没有发生。 我不能在这里深入了解一些事情,我会很感激帮助解决这个问题。 提前致谢!

我被异步/等待宠坏了! 现在正在努力与明确的任务延续

编辑(接受后) 它可能不会立即显现,但@Servy的答案是正确的,而不需要在monodroid下自定义实现Unwrap – 在我的评论中我说它不存在,但它确实存在。 结束编辑 我正在编写一堆使用我们的RESTful Web服务的应用程序,尽管我认为我知道如何正确使用任务但事实并非如此。 场景是我已经为Windows Store实现了代码 – 使用async/await我需要为MonoDroid实现几乎相同的东西 – 没有那个(没有我不想使用的构建攻击)。 我已经将这个问题的问题归结为一组简单的异步获取整数的任务,然后,在继续中,触发另一个异步任务,转换从该整数构建的字符串。 在C#5中,这将是: 注意 – 当然我在这里使用Task.FromResult代替实际的异步代码 private async Task GetStringAsync() { return await GetStringFromIntAsync(await GetIntAsync()); } private async Task GetIntAsync() { return await Task.FromResult(10); } private async Task GetStringFromIntAsync(int value) { return await Task.FromResult(value.ToString()); } 要将此转换为基于延续的模式,我试过这个: private Task GetStringAsync() { //error on this […]

db4o客户端/服务器似乎一次只能处理一个查询?

我们正在评估db4o(来自http://www.db4o.com的OO-DBMS)。 我们已经针对客户端/服务器模式进行了性能测试,我们将服务器启动,然后立即与几个客户端进行对话。 看起来服务器一次只能处理一个客户端的查询。 我们是否错过了允许这种情况的配置开关? 服务器实现如下。 客户端连接,查询(只读)和断开每个操作,并且操作在客户端进程中的多个工作线程之后立即运行。 如果我们将一个客户端进程分别针对同一个服务器,则我们会看到相同的行为。 有什么建议? 编辑:我们现在已经发现并尝试了Lazy和Snapshot QueryModes,尽管这可以缓解阻塞服务器问题(部分),但是当我们的客户端(我们运行40个等待1的并发测试客户端)时,我们仍然会看到严重的并发问题在发出随机操作请求之前-300ms锤击服务器。 似乎有来自LINQ提供程序和IO内部的exception:-( public class Db4oServer : ServerConfiguration, IMessageRecipient { private bool stop; #region IMessageRecipient Members public void ProcessMessage(IMessageContext con, object message) { if (message is StopDb4oServer) { Close(); } } #endregion public static void Main(string[] args) { //Ingestion.Do(); new Db4oServer().Run(true, true); } public void Run(bool shouldIndex, […]

SqlConnection线程安全吗?

我有一个Log类,它将日志放在Windows日志和SQL表中。 为了优化我的代码,我想只使用一个SqlConnection 。 在MSDN中,它说:此类型的任何public static (在Visual Basic中为Shared)成员都是线程安全的。 任何实例成员都不保证是线程安全的。 我的问题是: private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection); 它是线程安全的吗? 如果是,使用Open()和Close() ? 如果没有,如何正确使用SqlConnection ? 这是我的完整类代码: private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection); public static long WriteLog(string sSource, string sMessage, int iErrorCode, EventLogEntryType xErrorType) { // Windows Logs if (ConfigParameters.Instance.WindowsLog) EventLog.WriteEntry(sSource, sMessage, xErrorType, iErrorCode); // SQL Logs […]

线程:如何在完成后重新启动线程?

我有一个方法void DoWork(object input)大约需要5秒钟才能完成。 我已经读过Thread比ThreadPool更适合这些更长的操作,但我遇到了一个问题。 我点击一个调用threadRun.Start(input)的按钮,它运行并完成。 我再次单击该按钮并收到以下exception: Thread is running or terminated; it cannot restart. 你能否“重用”一个线程? 我应该使用ThreadPool吗? 与ThreadPool相比,为什么Thread“更适合更长时间的操作”? 如果你不能重用一个线程,为什么要使用它(即它提供了什么优势)?

在没有获得锁的情况下测试锁?

我有物品,他们得到锁。 我想测试他们是否被锁定而没有获得锁定。 我的想法是,如果我TryEnter()然后我必须Exit()如果为true只检查锁正确。 看起来像一个非常基本的问题,它是如何完成的?

为什么Task.WaitAny没有抛出exception?

在下面的代码中,“内部捕获块”从不打印。 尽管打印了“最后一行”。 为什么这样? 请帮忙。 Task task1 = Task.Factory.StartNew(() => { throw new Exception(“some exception”); }); try { Task.WaitAny(new Task[] { task1 }); } catch(Exception e) { Console.WriteLine(“Inside catch block.”); } Console.WriteLine(“Final line.”);

Thread.sleep vs Monitor.Wait vs RegisteredWaitHandle?

(以下项目有不同的目标,但我很有趣,知道他们如何“PAUSEd”) 问题 Thread.sleep – 它是否会影响系统的性能?是否会将线程与其等待捆绑在一起? 那么Monitor.Wait呢? 他们“等待”的方式有什么不同? 他们在等待时会占用一个线程吗? 那么RegisteredWaitHandle呢? 此方法接受在发出等待句柄信号时执行的委托。 虽然它在等待, 但它并没有占用一个线程。 所以一些线程被暂停并且可以被代表唤醒,而其他线程只是等待? 旋转? 有人可以让事情更清楚吗? 编辑 http://www.albahari.com/threading/part2.aspx

回调来自后台线程的WCF服务?

这是我的情况。 我编写了一个WCF服务,该服务调用我们供应商的代码库之一来执行操作,例如Login,Logout等。此操作的一个要求是我们有一个后台线程来接收由该操作引起的事件。 例如,Login操作在主线程上发送。 然后,由于登录,从供应商服务接收到多个事件。 可以收到1,2或几个事件。 在计时器上运行的后台线程接收这些事件并在wcf服务中触发事件以通知新事件已到达。 我已经在双工模式下实现了WCF服务,并计划使用回调来通知UI事件已到达。 这是我的问题:如何将后台线程中的新事件发送到正在执行服务的线程? 现在,当我调用OperationContext.Current.GetCallbackChannel() ,OperationContext为null。 有没有一个标准模式可以解决这个问题? 我在ServiceContract上使用PerSession作为我的SessionMode。 更新:我认为通过演示我如何从供应商代码接收事件,我会使我的确切情况更加清晰。 我的库接收每个事件,确定事件是什么,并触发该特定事件的事件。 我有另一个项目,它是一个专门用于连接供应商服务的类库。 我将发布服务的整个实现,以提供更清晰的图片: [ServiceBehavior( InstanceContextMode = InstanceContextMode.PerSession )] public class VendorServer:IVendorServer { private IVendorService _vendorService; // This is the reference to my class library public VendorServer() { _vendorServer = new VendorServer(); _vendorServer.AgentManager.AgentLoggedIn += AgentManager_AgentLoggedIn; // This is the eventhandler for the event […]

CultureInfo线程安全

我有一个解决一些文本的multithreading应用程序,它需要使用英文文化信息来解析这个文本中的数字。 所以,我不想每次调用解析函数时都创建EngCulture。 目前我正在通过EngCulture作为参数,但我对此并不满意。 我想将EngCulture定义为静态成员,因此它将由线程共享。 Msdn文档说“这种类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证是线程安全的。” 我只是使用以下函数,所以我怎么知道TryParse是否使用EngCulture的任何实例成员? public static CultureInfo EngCulture = new CultureInfo(“en-US”, false); void parser() { if (int.TryParse(value, NumberStyles.Number, EngCulture, out num))… }