Tag: multithreading

使用await时Monitor.Exit上的SynchronizationLockException

我正在创建一段代码,从我们拥有的遗留系统中获取网页。 为了避免过多的查询,我正在缓存获得的URL。 我正在使用Monitor.Enter , Monitor.Exit和双重检查以避免该请求被发出两次,但是当使用Monitor.Exit释放锁时,我收到此exception: System.Threading.SynchronizationLockException was caught HResult=-2146233064 Message=Object synchronization method was called from an unsynchronized block of code. Source=MyApp StackTrace: at MyApp.Data.ExProvider.d__0.MoveNext() in c:\Users\me\Documents\Visual Studio 2013\Projects\MyApp\MyApp\Data\ExProvider.cs:line 56 — End of stack trace from previous location where exception was thrown — at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at MyApp.Data.ExProvider.d__15.MoveNext() in c:\Users\me\Documents\Visual Studio […]

如何暂停/暂停一个线程然后继续它?

我在C#中创建一个应用程序,它使用winform作为GUI和一个在后台运行的独立线程自动更改东西。 例如: public void Run() { while(true) { printMessageOnGui(“Hey”); Thread.Sleep(2000); // Do more work } } 如何让它在循环中的任何位置暂停,因为循环的一次迭代大约需要30秒。 所以我不想在完成一个循环之后暂停它,我想按时暂停它。

如何在不同的安全上下文中启动线程?

如何在不同用户的安全上下文中启动一个线程? 当进程正常启动一个线程时,安全上下文也会被传递但是如何在不同安全上下文中使用不同用户的主体启动一个线程?

MessageBox.Show()是否自动编组到UI线程?

我通过ThreadPool.QueueUserWorkItem启动一个线程,其中有一个消息框对话框: System.Windows.Forms.DialogResult dr = System.Windows.Forms.MessageBox.Show(“你想在后台下载升级吗?..”,“升级可用”,MessageBoxButtons.YesNo); 它看起来工作正常,但是在一些客户建议他们没有收到消息后我有点怀疑。 我有.NET Framework 2.0+的感觉你不需要编组这个特定的调用,它会为你做。 正确? 这是一个感兴趣的半相关主题: 为什么在MessageBox.Show中使用所有者窗口?

如何将BitmapImage从后台线程传递到WPF中的UI线程?

我有一个后台线程,生成一系列BitmapImage对象。 每次后台线程完成生成位图时,我想向用户显示此位图。 问题是弄清楚如何将BitmapImage从后台线程传递到UI线程。 这是一个MVVM项目,所以我的视图有一个Image元素: 我的视图模型有一个属性GeneratedImage : private BitmapImage _generatedImage; public BitmapImage GeneratedImage { get { return _generatedImage; } set { if (value == _generatedImage) return; _generatedImage= value; RaisePropertyChanged(“GeneratedImage”); } } 我的视图模型还有创建后台线程的代码: public void InitiateGenerateImages(List coordinates) { ThreadStart generatorThreadStarter = delegate { GenerateImages(coordinates); }; var generatorThread = new Thread(generatorThreadStarter); generatorThread.ApartmentState = ApartmentState.STA; generatorThread.IsBackground = true; generatorThread.Start(); […]

C#Thread对象的生命周期

假设我有如下代码: int Main() { if (true) { new Thread(()=> { doSomeLengthyOperation(); }).Start(); } while (true) { //do nothing } } 有两个线程,我将调用Main线程执行Main()函数的线程,并在“if”测试中将线程作为线程A新建。 我的问题是,线程A什么时候被销毁? do doSomeLenghtyOperation()能够完成吗? 由于没有指向线程A的引用,它是否会被标记为垃圾收集的候选者: 紧接着“new Thread()。Start()”语句本身结束了吗? 退出“if(true)”范围后立即? doSomeLengthOperation()运行完成后? 决不? 我看到的所有示例都是Main()持有引用,然后主线程在退出之前等待与线程A连接。 我很好奇上面代码的生命周期是什么。 提前致谢!

在冷IObservable上暂停和恢复订阅

使用Rx ,我希望在以下代码中暂停和恢复function: 如何实现Pause()和Resume()? static IDisposable _subscription; static void Main(string[] args) { Subscribe(); Thread.Sleep(500); // Second value should not be shown after two seconds: Pause(); Thread.Sleep(5000); // Continue and show second value and beyond now: Resume(); } static void Subscribe() { var list = new List { 1, 2, 3, 4, 5 }; var obs = […]

为什么这个web api控制器不兼容?

我有一个Web API控制器,里面有以下方法: public string Tester() { Thread.Sleep(2000); return “OK”; } 当我调用它10次(使用Fiddler)时,我希望所有10个调用在~2秒后返回。 然而,呼叫分别在2,4,8 …… 20秒后返回。 什么阻止它同时运行? 我该如何解决这个问题? 常规控制器的行为与web-api控制器相同吗?

高频时序.NET

我正在寻找创建一个高频回调线程。 基本上我需要一个以常规高频(高达100Hz)间隔执行的function。 我意识到Windows有一个正常的线程执行切片是〜15ms。 我想指定一个可以快于15ms的常规间隔。 这就是我想要完成的。 我有一个需要以一定间隔发送消息的外部设备。 间隔根据情况而变化。 我希望我不需要超过100Hz(10ms)的消息速率。 我当然可以实现一个自旋循环,但是,我希望有一个解决方案不需要浪费太多资源。 提供的问题/答案链接无法解决此问题。 虽然我同意这个问题有几种不同的问题,但实际上并没有一个好的解决方案可以解决问题。 提供的大多数答案都与使用秒表和手动执行计时任务有关,这完全是CPU密集型的。 唯一可行的解​​决方案是使用多媒体定时器,这有一些陷阱,正如Haans所说。 我找到了另一种解决方案,但我将在下面添加。 我不知道此时的陷阱,但我打算做一些测试和研究。 我仍然对有关解决方案的评论感兴趣。 WINAPI通过电话 BOOL WINAPI CreateTimerQueueTimer( _Out_ PHANDLE phNewTimer, _In_opt_ HANDLE TimerQueue, _In_ WAITORTIMERCALLBACK Callback, _In_opt_ PVOID Parameter, _In_ DWORD DueTime, _In_ DWORD Period, _In_ ULONG Flags ); 和 BOOL WINAPI DeleteTimerQueueTimer( _In_opt_ HANDLE TimerQueue, _In_ HANDLE Timer, _In_opt_ HANDLE CompletionEvent […]

如果前一个线程仍然忙,如何让Timer跳过勾选

我创建了一个Windows服务,它应该每隔60秒检查数据库中的某个表以获取新行。 对于添加的每个新行,我需要在服务器上进行一些繁重的处理,有时可能需要60秒以上。 我在我的服务中创建了一个Timer对象,每隔60秒就会调用一次,并调用所需的方法。 由于我不想在处理找到的新行时勾选此计时器,因此我将该方法包装在lock { }块中,因此其他线程无法访问此方法。 它看起来像这样: Timer serviceTimer = new Timer(); serviceTimer.Interval = 60; serviceTimer.Elapsed += new ElapsedEventHandler(serviceTimer_Elapsed); serviceTimer.Start(); void serviceTimer_Elapsed(object sender, ElapsedEventArgs e) { lock (this) { // do some heavy processing… } } 现在,我想知道 – 如果我的计时器滴答,并在数据库上发现了很多新行,现在处理将花费超过60秒,下一个滴答将不会进行任何处理,直到前一个完成。 这就是我想要的效果。 但是现在,serviceTimer_Elapsed方法会在第一次处理完成后立即关闭,还是等待计时器再次打勾。 我想要发生的是 – 如果处理需要超过60秒,那么计时器会发现线程被锁定,再等待60秒再次检查,这样我就永远不会陷入线程队列的情况等待前一个完成。 我怎样才能完成这个结果? 这样做的最佳做法是什么? 谢谢!