Tag: multithreading

为每个线程分配一个cpu核心

我有一个用.net 4编写的Windows服务,它使用Threads定期做作业。 服务器有超过20个CPU核心。 我在我的Windows服务中创建10个线程。 是否可以为每个线程分配一个cpu核心?

执行按钮单击时,使wpf UI响应

在我的wpf(c#)应用程序中,当用户按下按钮时执行一个很长的过程。 按下按钮直到完成代码执行窗口冻结,用户无法在窗口中执行任何其他任务。 如何使按钮单击代码作为后台进程,以便窗口响应用户。 我尝试了以下方法,但没有成功。 private void btn_convert_Click(object sender, RoutedEventArgs e) { Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => { WorkerMethod(); })); } WorkerMethod是整个代码的函数。 任何建议。 问候, 桑杰塔

INotifyPropertyChanged和线程

我有一个实现INotifyPropertyChanged的基类: protected void OnNotifyChanged(string pName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(pName)); } } public event PropertyChangedEventHandler PropertyChanged; 我有一个带有Latitude属性的派生类,如下所示: private double latitude; public double Latitude { get { return latitude; } set { latitude = value; OnNotifyChanged(“Latitude”); } } 我的派生类也有一个方法Fly来操纵Latitude 。 我还有一个Form,其TextBox绑定到我的派生类的Latitude : txtLat.DataBindings.Clear(); txtLat.DataBindings.Add(“Text”, bindSrc, “Latitude”); 一个线程用于启动Fly如下所示: Thread tFly = new Thread(f.Fly); […]

共享范围等待

我有一个UserScope类,其function类似于TransactionScope ,即它将当前状态存储在本地线程中。 这当然不适用于await调用,在.NET 4.5.1中添加TransactionScope之前, TransactionScopeAsyncFlowOption也没有。 我可以使用什么替代线程本地,以便UserScope可以在单线程和multithreading场景中使用相同的? (如果我安装了4.5.1,我会反编译以查看TransactionScope是如何做到的。)这是我所拥有的简化版本: class User { readonly string name; public User(string name) { this.name = name; } public string Name { get { return this.name; } } } class UserScope : IDisposable { readonly User user; [ThreadStatic] static UserScope currentScope; public UserScope(User user) { this.user = user; currentScope = this; } […]

Azure ServiceBus和async – 是或不是?

我正在Azure上运行Service Bus, 每秒抽取大约10-100条消息 。 最近我转而使用.net 4.5并且所有兴奋重构的所有代码都在每行中至少有两次‘async’和’await ‘,以确保它’正确’完成’:) 现在我想知道它实际上是好还是坏 。 如果你能看一下代码片段,请告诉我你的想法。 我特别担心,如果线程上下文切换没有给我带来更多的悲伤而不是从所有异步中获益……(看看!dumpheap肯定是一个因素) 只是一点描述 – 我将发布2个方法 – 一个在ConcurrentQueue上执行while循环,等待新消息和另一个一次发送一条消息的方法。 我也正如Azure博士所规定的那样使用Transient Fault Handling块。 发送循环(从头开始,等待新消息): private async void SendingLoop() { try { await this.RecreateMessageFactory(); this.loopSemaphore.Reset(); Buffer message = null; while (true) { if (this.cancel.Token.IsCancellationRequested) { break; } this.semaphore.WaitOne(); if (this.cancel.Token.IsCancellationRequested) { break; } while (this.queue.TryDequeue(out message)) { try { using […]

c#引用其他类的静态属性时的线程安全性

我有一个方法来生成我写的完全限定的URL,我希望它具有静态,因此很容易根据需要从模型调用。 我仍然遇到问题,但是能否决定它的线程是否安全。 这是代码。 public string GenerateURLFromModel(string action, string controller) { HttpContextWrapper wrapper = new HttpContextWrapper(HttpContext.Current); Uri url = HttpContext.Current.Request.Url; UrlHelper urlHelper = new UrlHelper(new RequestContext(wrapper, RouteTable.Routes.GetRouteData(wrapper))); return url.AbsoluteUri.Replace(url.PathAndQuery, urlHelper.Action(action, controller)); } 我所知道的是: 1)传入的两个字符串将是线程安全的,因为它们是不可变的引用类型。 2)在静态方法中实例化的所有对象都可以被认为是线程安全的,因为它们仅存在于该特定线程的堆栈上。 我不确定的是: 1)如何在此方法中使用HttpContext.Current和RouteTable.Routes? 它们都是我传递给构造函数的静态属性。 我的问题是: 1)使用这些静态属性有什么含义? 2)我对这种方法的安全性的其余理解是否正确? 3)将来我可以记住哪些规则来帮助确定这种情况下的线程安全性?

在C#中使数据集线程安全

在写入时使数据集线程安全的最佳模式是什么? 我通过谷歌搜索找到的最好的是“实现一个带锁的包装层”,但乍一看这看起来相当混乱。 有人可以推荐/指出我的方向来解决这个问题吗? 这似乎是一个已经在某处解决过的问题。 编辑:我还需要将数据集绑定到ui网格,这在某种程度上使问题复杂化。

高性能缓存

以下代码应该缓存上次读取。 LastValueCache是一个可以被许multithreading访问的缓存(这就是我使用共享内存的原因)。 我可以有竞争条件,但我希望其他线程会看到更改的LastValueCache 。 class Repository { public Item LastValueCache { get { Thread.MemoryBarrier(); SomeType result = field; Thread.MemoryBarrier(); return result; } set { Thread.MemoryBarrier(); field = value; Thread.MemoryBarrier(); } } public void Save(Item item) { SaveToDatabase(item); Item cached = LastValueCache; if (cached == null || item.Stamp > cached.Stamp) { LastValueCache = item; } } […]

使Guid属性线程安全

我的一个类有一个Guid类型的属性。 此属性可以由多个线程同时读取和写入。 我的印象是对Guid的读写不是primefaces的,因此我应该锁定它们。 我选择这样做: public Guid TestKey { get { lock (_testKeyLock) { return _testKey; } } set { lock (_testKeyLock) { _testKey = value; } } } (在我的课程中,所有对Guid的访问也是通过该属性完成的,而不是直接访问_testKey。) 我有两个问题: (1)是否真的有必要像这样锁定Guid以防止撕裂读数? (我很确定它是。) (2)这是一种合理的锁定方式吗? 或者我需要像下面这样做: get { Guid result; lock (_testKeyLock) { result = _testKey; } return result; } [编辑]本文确认Guids将遭受撕裂的读取: http : //msdn.microsoft.com/en-us/magazine/jj863136.aspx

马歇尔手动线程

在WinForms中,您有Control.BeginInvoke() ,这意味着您可以编组从后台线程到创建控件句柄的主UI线程的调用。 这很好,但是如何(在C#中)你会在两个“标准”线程之间做到这一点? 我编写了一个服务总线,它有一个处理器线程来消费消息。 我想要一个计时器来触发,这会导致处理器线程做某事,而不是在计时器的线程中运行的代码。 当然我可以使用线程同步( Monitor / using() {…} ),但想知道它是如何正常完成的。