Tag: multithreading

并行不适用于Entity Framework

我有一个ID列表,我需要在每个ID上运行几个存储过程。 当我使用标准的foreach循环时,它工作正常,但是当我有很多记录时,它的工作速度很慢。 我想将代码转换为与EF一起使用,但我得到一个例外:“底层提供程序在Open上失败”。 我在Parallel.ForEach中使用此代码: using (XmlEntities osContext = new XmlEntities()) { //The code } 但它仍然抛出exception。 任何想法我如何使用与EF并行? 我是否需要为我正在运行的每个程序创建一个新的上下文? 我有大约10个程序,所以我认为创建10个上下文非常糟糕,每个上下文一个。

为什么只允许UI线程修改UI?

我知道如果我从不同的线程修改控件,我应该小心,因为WinForms和WPF不允许从其他线程修改控件的状态。 为什么这个限制到位了? 如果我可以编写线程安全的代码,我应该能够安全地修改控制状态。 那为什么会出现这种限制?

Dispatcher Invoke(…)vs BeginInvoke(…)混淆

我很困惑为什么我不能让这个测试计数器应用程序使用Count()方法在我的Dispatcher上使用“BeginInvoke”的2个(或更多个)同时运行的反文本框。 您可以通过Invoke替换BeginInvoke来解决问题。 但这并不能解决我的困惑。 这是我正在谈论的示例代码: public class CounterTextBox : TextBox { private int _number; public void Start() { (new Action(Count)).BeginInvoke(null, null); } private void Count() { while (true) { if (_number++ > 10000) _number = 0; this.Dispatcher.BeginInvoke(new Action(UpdateText), System.Windows.Threading.DispatcherPriority.Background, null); } } private void UpdateText() { this.Text = “” + _number; } }

具有multithreading或任务的进程队列

我有一个电话消息应用程序,其中有许多消息要处理。因为电话端口是有限的,所以消息将先进行处理。 每条消息都有一个标记’Acknowledge’,表示处理的是哪一个。 当然它被初始化为假。 我想将所有消息放入队列,然后使用多个线程或任务处理它们。 public class MessageQueue { public Queue MessageWorkItem { get; set; } public Messages Message { get; set; } public MessageQueue() { MessageWorkItem = new Queue(); Message = new Messages(); } public void GetMessageMetaData() { try { // It is just a test, add only one item into the queue Message.MessageID = […]

调用线程无法访问此对象,因为另一个线程拥有它.WPF

每当我刷新标签时,我都会收到此错误: 调用线程无法访问此对象,因为另一个线程拥有它。 我试图调用,但它失败了。 我正在使用WPF表格。 delegate void lostfocs(string st); private void imgPayment_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Thread t = new Thread(modi); t.Start(); } void modi() { try { label1.Content = “df”; } catch { lostfocs ld = new lostfocs(up); // ld.Invoke(“df”); object obj=new object(); ld.Invoke(“sdaf”); } } void up(string st) { label1.Content = st; }

如何在C#中终止一个线程?

我想试试用C#进行线程化,我知道一些关于C语言的线程。 所以我只是想问一下我是否要终止一个线程,我应该用smt.Abort()来做,否则它会在函数结束后“自杀”? 另外,C#中的C中是否有类似pthread_exit()东西? 对不起我的英语不好。 🙂

如何使.NET COM对象成为单元线程?

默认情况下,.NET对象是自由线程的。 如果通过COM封送到另一个线程,它们总是被封送到自己,无论创建者线程是否是STA,并且无论其ThreadingModel注册表值如何。 我怀疑,他们聚合了Free Threaded Marshaler (有关COM线程的更多细节可以在这里找到)。 我想让我的.NET COM对象在封送到另一个线程时使用标准的COM marshaller代理。 问题: using System; using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using System.Windows.Threading; namespace ConsoleApplication { class Program { static void Main(string[] args) { var apt1 = new WpfApartment(); var apt2 = new WpfApartment(); apt1.Invoke(() => { var comObj = new ComObject(); comObj.Test(); IntPtr pStm; NativeMethods.CoMarshalInterThreadInterfaceInStream(NativeMethods.IID_IUnknown, comObj, out […]

无效的跨线程访问问题

我有两个ViewModel类:PersonViewModel和PersonSearchListViewModel。 PersonViewModel实现的一个字段是通过WCF下载的配置文件映像(在独立存储中本地缓存)。 PersonSearchListViewModel是一个容器类,它包含一个Persons列表。 由于加载图像相对较重,因此PersonSearchListViewModel仅加载当前页面,下一页面和上一页面的图像(结果在UI上分页)…为了进一步改善图像的负载,我将图像的加载放在另一个线程上。 但是,multithreading方法会导致跨线程访问问题。 PersonViewModel: public void RetrieveProfileImage() { Image profileImage = MemorialDataModel.GetImagePerPerson(Person); if (profileImage != null) { MemorialDataModel.ImageManager imgManager = new MemorialDataModel.ImageManager(); imgManager.GetBitmap(profileImage, LoadProfileBitmap); } } private void LoadProfileBitmap(BitmapImage bi) { ProfileImage = bi; // update IsProfileImageLoaded = true; } private BitmapImage profileImage; public BitmapImage ProfileImage { get { return profileImage; } set […]

使用C#MethodInvoker.Invoke()获取GUI应用程序……这样好吗?

使用C#2.0和MethodInvoker委托,我有一个GUI应用程序从GUI线程或工作线程接收一些事件。 我使用以下模式处理表单中的事件: private void SomeEventHandler(object sender, EventArgs e) { MethodInvoker method = delegate { uiSomeTextBox.Text = “some text”; }; if (InvokeRequired) BeginInvoke(method); else method.Invoke(); } 通过使用这种模式,我不会复制实际的UI代码,但我不确定的是这种方法是否合适。 特别是这条线 method.Invoke() 它是否使用另一个线程进行调用,或者它是否有点转换为直接调用GUI线程上的方法?

C#手动锁定/解锁

我在C#中有一个函数,可以从多个线程多次调用,我希望它只能完成一次,所以我想到了这个: class MyClass { bool done = false; public void DoSomething() { lock(this) if(!done) { done = true; _DoSomething(); } } } 问题是_DoSomething需要很长时间,我不希望许multithreading等待它,只要他们可以看到done是真的。 这样的事情可以解决方法: class MyClass { bool done = false; public void DoSomething() { bool doIt = false; lock(this) if(!done) doIt = done = true; if(doIt) _DoSomething(); } } 但只是手动锁定和解锁会更好。 如何像lock(object)一样手动锁定和解锁? 我需要它使用相同的接口作为lock以便这种手动方式和lock将相互阻塞(对于更复杂的情况)。