Tag: multithreading

线程在锁定FIFO上等待吗?

假设我有以下代码 static class … { static object myobj = new object(); static void mymethod() { lock(myobj) { // my code…. } } } 然后让我们说当thread1有锁定时,thread2尝试运行mymethod。 是否会等待释放锁定或抛出exception? 如果它确实等待,是否确保订单,以便如果其他线程进入它们是FIFO?

在WinForms线程上使用CoInitializeEx

我正在为DSLR相机制作SDK,其中包含以下说明: 开发Windows应用程序的注意事项创建在Windows下运行的应用程序时,每个线程都需要进行COM初始化,以便从主线程以外的线程访问摄像机。 要创建用户线程并从该线程访问摄像机,请确保在线程的开头执行CoInitializeEx(NULL,COINIT_APARTMENTTHREADED),最后执行CoUnInitialize()。 示例代码如下所示。 从另一个线程控制EdsVolumeRef或EdsDirectoryItemRef对象时,这是相同的,而不仅仅是EdsCameraRef。 void TakePicture(EdsCameraRef camera) { // Executed by another thread HANDLE hThread = (HANDLE)_beginthread(threadProc, 0, camera); // Block until finished ::WaitForSingleObject( hThread, INFINITE ); } void threadProc(void* lParam) { EdsCameraRef camera = (EdsCameraRef)lParam; CoInitializeEx( NULL, COINIT_APARTMENTTHREADED ); EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0); CoUninitialize(); _endthread(); } 我的应用程序是一个C#WinForms应用程序,通常,我使用托管线程类和Control.Invoke函数来避免跨线程问题。 由于我在C#中没有使用SDK的示例源代码,我的问题是,在标有[STAThread]属性的应用程序中使用CoInitializeEx是否有用和/或必要? 我没有遇到一个场景,我需要让我的应用程序为线程创建一个新的公寓,所以一些洞察力将有助于更好地理解线程模型。 更新:在阅读了更多关于公寓和COM之后,它开始有所了解。 现在我想知道.NET托管线程类默认是什么,我们可以以托管的方式为每个线程指定一个没有P / Invoke的公寓模型吗?

异步等待阻止ui wp8

据我所知,async await关键字以这种方式工作:当编译器遇到await关键字时,它会暂停执行异步函数给调用者(在本例中为调度程序),等待等待函数完成后台然后返回到该函数。 我对吗? 这就是我在做的事情: async private void Button_Tap(object sender, System.Windows.Input.GestureEventArgs e) { var p = await query(“select* from notes”, con); } 这是被调用的函数 async Task<List> query(string sqlstring, SQLiteConnection con) { var p = con.Query(sqlstring); Thread.Sleep(5000); MessageBox.Show(p[0].Data); return p; } 这会阻止UI线程。 为什么发生这种情况不应该在遇到await关键字时将控制权转移回调度程序? 如果是这样,为什么用户界面会被卡住?

C#中的后台线程

我是C#的新手。我了解到通常所有线程都是前景,除非你使用IsBackGround = true明确地将它指定为“后台”线程。 我脑子里浮现出一些疑惑。 1)将线程保留为后台线程有什么好处? 2)执行以下代码时: static void Main(string[] args) { Thread worker = new Thread(SayHello); worker.IsBackground = true; worker.Start(); Console.WriteLine(“Hello From Main”); } static void SayHello() { Console.WriteLine(“Hello World”); Console.ReadKey(true); } 我需要使用worker.Join()来保持主线程等待程序立即终止。 除了Join()我可以使用其他技术来保持主线程等待吗?

MessageBox.Show可以导致跨线程exception吗?

我可以在子线程上调用MessageBox.Show而不必担心跨线程exception吗? 我知道表面上的答案是“尝试并找出”,我做了,成功了,但我注意到Windows 7似乎不像Windows XP那样严格提出跨线程exception。 那么,它是否记录在任何地方,从子线程可以安全地做到这一点?

为什么SynchronizationContext.Current为null?

错误: Object reference not set to an instance of an object. 下面的算法有效。 我尝试了,然后我将Winform项目删除到另一个目录,并且SynchronizationContext.Current为null 。 为什么? SynchronizationContext uiCtx = SynchronizationContext.Current; private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int[] makeSelfMoves = new int[4]; lock (replay) { // count should be more than 2 foreach (KeyValuePair item in replay) { makeSelfMoves = replay[item.Key]; codeFile.ExecuteAll(makeSelfMoves[0], makeSelfMoves[1], makeSelfMoves[2], makeSelfMoves[3]); // […]

将BlockingCollection 用作单生成器,单用户FIFO查询是否合适?

我需要单生成器,单用户FIFO查询,因为 我需要按照收到的顺序处理邮件。 我需要这样做异步,因为调用者不应该在我处理消息时等待。 只有在完成上一个消息处理时,才应启动下一个消息处理。 有时“接收”消息的频率高于“处理”消息的频率。 但平均而言,我应该能够处理所有消息,有时候我必须“排队”它们。 所以它就像我认为的TCP / IP,你有一个生产者和一个消费者,有时你可以比你可以处理的更快地接收消息,所以你必须查询它们。 在哪里订单很重要,并且调用者对你用这些东西做什么完全不感兴趣。 这听起来很容易,我可能会使用通用Queue ,但我想使用BlockingCollection ,因为我不想用ManualResetEvent等编写任何代码。 BlockingCollection对我的任务有多适合,可能你还可以推荐别的东西?

后台工作者在自己的class级处理

好吧,我有以下问题,希望你能帮助我: 我想创建一个带后台工作程序的WPF应用程序,用于更新richtextboxes和其他UI元素。 这个后台工作者应该处理一些数据,例如处理文件夹的内容,做一些解析等等。 因为我想在Main类之外移动尽可能多的代码,所以我创建了一个名为MyProcess.cs类,如下所示(事实上,到目前为止,这个类没有多大意义,它将填充更多处理元素,如果这个问题已经解决)。 一般function应该是: MainWindow:将创建一个字符串数组(名为this.folderContent ) MainWindow:后台工作者开始将此数组作为参数 MainWindow:将调用DoWork()方法(我知道,这个方法现在在一个新线程中运行) MyProcess:根据给定的字符串数组生成一个(迄今为止未格式化的)段落 MainWindow:如果后台工作程序完成,则调用RunWorkerCompleted()方法(在UI线程中运行),该方法应通过方法的返回参数更新WPF RichTextBox 最后一步导致带有注释的InvalidOperationsException,“调用线程无法访问此对象,因为另一个线程拥有它”。 我读了一下后台工作者类及其function。 所以我认为它与this.formatedFilenames.Inlines.Add(new Run(…))的Execute()方法中的this.formatedFilenames.Inlines.Add(new Run(…))调用MyProcess 。 如果我用字符串列表或类似的东西替换Paragraph属性(没有额外的new()调用)我可以通过get方法访问此成员而不会出现任何问题。 与我发现的后台工作者相关的所有示例都只返回基本类型或简单类。 MainWindow.xaml.cs public MainWindow() { InitializeComponent(); this.process = new MyProcess(); this.worker = new BackgroundWorker(); this.worker.DoWork += worker_DoWork; this.worker.RunWorkerCompleted += worker_RunWorkerCompleted; } private void worker_DoWork(object sender, DoWorkEventArgs e) { this.process.Execute((string[])e.Argument); e.Result = this.process.Paragraph(); } private void worker_RunWorkerCompleted(object […]

multithreading谜语更好的解决方案?

这是任务:我需要根据文件名锁定。 最多可以有一百万个不同的文件名。 (这用于大规模基于磁盘的缓存)。 我希望内存使用率低,查找时间短,这意味着我需要一个GC锁定字典。 (dict中只能存在使用中的锁)。 回调操作可能需要几分钟才能完成,因此全局锁定是不可接受的。 高吞吐量至关重要。 我已经在下面发布了我当前的解决方案,但我对复杂性感到不满意。 编辑:请不要发布不是100%正确的解决方案。 例如,允许在“获取锁定对象”阶段和“锁定”阶段之间从字典中删除锁定的解决方案是不正确的,无论它是否是“已接受”的设计模式。 有比这更优雅的解决方案吗? 谢谢! [编辑:我根据RobV的建议更新了我的代码以使用循环与递归] [编辑:再次更新代码以允许’超时’和更简单的调用模式。 这可能是我使用的最终代码。 仍然与原始post中的基本算法相同。] [编辑:再次更新代码以处理回调内部的exception,而无需孤立锁定对象] public delegate void LockCallback(); /// /// Provides locking based on a string key. /// Locks are local to the LockProvider instance. /// The class handles disposing of unused locks. Generally used for /// coordinating writes to files (of […]

如何将变量传递给另一个线程

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine(“Taking data from Main Thread\n->”); string message = Console.ReadLine(); ThreadStart newThread = new ThreadStart(delegate { Write(message); }); Thread myThread = new Thread(newThread); } public static void Write(string msg) { Console.WriteLine(msg); Console.Read(); } } }