Tag: multithreading

.NET服务是否表现出线程敏捷性?

与此相关的问题以及关于ASP.NET线程敏捷性的问题相关:用C#编写的Windows服务是否表现出与ASP.NET中相同的线程敏捷性行为? 或者线程敏捷性是IIS的一个特性而不是.NET? 我真正想要的是,我可以确定Windows服务中的线程管理完全取决于服务本身吗? 或者,如果选择这样做,.NET可以在长时间运行的服务中跳转线程吗?

为什么你可以在WinForms中交叉线程添加控件,而不是WPF?

在虚拟WinForms应用程序中,我能够在设计时创建ListBox,在运行时创建后台线程,然后从后台线程向ListBox添加控件。 但如果我在WPF中做同样的事情,我会收到错误。 为什么我能在WinForms中执行此操作,但不能在WPF中执行此操作? 我的WinForm示例与WPF示例不一样吗? 或者确实有一个理由说它在WinForms中工作得很好而不是WPF? 的WinForms: private List _labels; public Form1() { InitializeComponent(); Thread test = new Thread(DoStuff); test.SetApartmentState(ApartmentState.STA); test.Start(); } private void DoStuff() { _labels = new List(); _labels.Add(new Label() { Text = “Label1” }); _labels.Add(new Label() { Text = “Label2” }); _labels.Add(new Label() { Text = “Label3” }); if (listBox1.InvokeRequired) { listBox1.Invoke((MethodInvoker)delegate { […]

在C#中从主线程以外的线程访问COM对象慢

我有一个专有的COM库,它返回一个整数数组(当然是以他们自己的专有格式)。 当我从主UI线程访问此数组时,一切都很顺利并且运行得很快。 当我从另一个线程访问它时,访问速度非常慢。 下面有一些示例代码。 private void test() { ProprietaryLib.Integers ints = ProprietaryLib.GetInts(); int x; for(int i = 0; i < 500; i++) for(int j = 0; j test()).Start(); // Lots of time } 为什么会这样? 我有什么方法可以加快速度吗? 如果我使用多处理而不是multithreading,那么我是否有希望获得良好的性能? (虽然,听起来更复杂。) 更新: 我对下面的答案感到满意,但是想在这里添加一些数据以供参考(我自己和其他人的)。 如上所示在新线程中创建和访问对象,每次访问大约12ns。 据推测,该对象实际上是在主线程上创建的,而慢速是由于从那里封送数据。 如果您在主线程上显式创建数据但在标记为单线程单元的新线程中访问它,则访问时间会更慢,每次访问时间为15 ns。 我想.NET必须有一些额外的开销来保持公寓的美观,尽管它让我担心我不知道那是什么开销。 只有2-3 ns的差异,但不一定要多。 如果您在标记为STA的新线程上创建并访问该对象,则每次访问时间会以.2ns的速度消失。 但这个新线程真的安全吗? 这是我想到的另一个问题的问题。

在async / await中重入?

我有一个按钮,它有一个async处理程序,它在异步方法上调用等待。 这是它的样子: private async void Button1_OnClick(object sender, RoutedEventArgs e) { await IpChangedReactor.UpdateIps(); } 以下是IpChangedReactor.UpdateIps()外观: public async Task UpdateIps() { await UpdateCurrentIp(); await UpdateUserIps(); } 它一直是异步的。 现在我有一个DispatcherTimer ,它在tick事件中重复调用await IpChangedReactor.UpdateIps 。 假设我点击了按钮。 现在事件处理程序在UpdateIps上UpdateIps并返回到调用者,这意味着WPF将继续执行其他操作。 在此期间,如果计时器被触发,它将再次调用UpdateIps ,现在两个方法将同时运行。 所以我看到的方式是它类似于使用2个线程。 竞争条件会发生吗? (我的一部分说不,因为它都在同一个线程中运行。但它令人困惑) 我知道异步方法不一定在单独的线程上运行。 但是,在这种情况下,它非常令人困惑。 如果我在这里使用同步方法,它将按预期工作。 计时器滴答事件将仅在第一次呼叫完成后运行。 有人可以开导我吗?

Sqlite中的multithreading

我使用System.data.sqlite连接到Sqlite数据库,根据Sqlite文档 ,用户可以通过使用SQLITE_OPEN_NOMUTEX标志作为连接字符串的一部分来启用multithreading。 但我找不到接受标志的连接字符串中的任何键。 它是默认启用的吗? 如果不是我怎么能这样做?

这是.NET 4.5的WhenAll的正确.NET 4实现吗?

我正在使用SignalR。 Hub上的function通常返回一个Task。 我现在有一个函数可以添加一组连接。 我想返回一个代表所有这些任务的Task。 我找到了一个完美的function:Task.WhenAll。 然而,这是.NET 4.5中的一项新function,我仍然坚持使用.NET 4。 因此,我决定编写自己的版本,直到我们可以转到.NET 4.5。 因为在涉及multithreading时经常有一些警告(例如线程池的东西),我不确定我的实现是否正确: public static Task WhenAll(IEnumerable tasks) { return Task.Factory.StartNew(() => Task.WaitAll(tasks.ToArray())); } 在function上,我认为它可行,但是我不会为新任务获得额外的阻塞线程吗? 或者这是不可避免的? 编辑:以下是我将如何与SignalR一起使用: public static Task Add(this IGroupManager groupManager, string connectionId, IEnumerable groups) { return WhenAll(groups.Select(group => groupManager.Add(connectionId, group))); }

占位符,用于在c#线程上下文中存储临时值

我想在ac#thread上下文或类似的东西中存储一些信息(键值对)(就像http请求的httpcontext一样)。 我希望能够在线程上下文(或类似的东西)中的某处存储此信息(键值对),以便我的代码始终可以从其运行的当前线程中读取这些值。 在我的appliation中,我有一系列API调用,并且无法将此信息从一个方法传递给其他方法(已经使用此选项!) note – 此线程在Asp.Net应用程序中作为异步操作运行。

Thread.Join似乎错误地返回false

我使用Thread.Join(int millisecondsTimeout)来终止一些AppDomain 。 通常,我收到一条错误消息,指出AppDomain未在5秒内终止。 在单步执行调试器时,我发现AppDomain.Unload()调用在5秒内很容易终止,但Thread.Join返回false。 我哪里错了? var thread = new Thread( () => { try { AppDomain.Unload(someAppDomain); } catch (ArgumentNullException) { } catch (CannotUnloadAppDomainException exception) { // Some error message } }); thread.Start(); const int numSecondsWait = 5; if (!thread.Join(1000 * numSecondsWait)) { // Some error message about it not exiting in 5 seconds } […]

Debug.WriteLine锁定

我的程序经常因死锁而停止。 当我做一个全部细节并查看线程时,我看到三个线程卡在我们的日志记录function中: public class Logging { public static void WriteClientLog(LogLevel logLevel, string message) { #if DEBUG System.Diagnostics.Debug.WriteLine(String.Format(“{0} {1}”, DateTime.Now.ToString(“HH:mm:ss”), message)); //LOCK #endif //…Log4net logging } } 如果我让程序继续,线程仍然停留在该行上。 我无法看到它可以锁定的位置。 调试类,字符串类和日期时间类似乎是线程安全的。 当我删除#if DEBUG System… #endif代码时,错误就消失了,但我很好奇为什么会出现这种情况。 线程一: public void CleanCache() { Logging.WriteClientLog(LogLevel.Debug, “Start clean cache.”);//Stuck } 线程二: private void AliveThread() { Logging.WriteClientLog(LogLevel.Debug, “Check connection”);//Stuck }

在multithreading程序中使用EF的好建议?

您是否有一些好的建议在multithreading程序中使用EF? 我有2层: 一个EF层来读/写我的数据库 一个multithreading服务,它使用我的实体(读/写)并进行一些计算(我在框架中使用任务并行库) 如何在每个线程中同步我的对象上下文? 你知道一个好的模式让它发挥作用吗?