Tag: multithreading

asp.net缓存multithreading锁定webparts

我有以下场景: 假设我们有两个不同的webparts在相同的数据上运行 – 一个是饼图,另一个是数据表。 在他们的Page_Load中,他们异步地从数据库加载数据,并在加载时将其放在应用程序缓存中以供进一步使用或由其他Web部件使用。 因此,每个Web部件都有类似于此的代码: protected void Page_Load(object sender, EventArgs e) { if (Cache[“dtMine” + “_” + Session[“UserID”].ToString()]==null) { … Page.RegisterAsyncTask(new PageAsyncTask( new BeginEventHandler(BeginGetByUserID), new EndEventHandler(EndGetByUserID), null, args, true)); } else { get data from cache and bind to controls of the webpart } } 由于两个webpart都在相同的数据上运行,因此对我来说执行代码两次没有意义。 让一个Web部件与另一个进行通信的最佳方法是什么?“我已经在获取数据,所以只要等到我将其放入缓存”? 我一直在考虑互斥锁,锁定,为缓存项分配临时值并等待临时值更改…许多选项 – 我应该使用哪一个。

MonoDroid:从Web服务读取大型json字符串时间歇性失败

我在一个线程上使用下面的代码(在ui中显示进度对话框)从ASP.Net MVC Web服务中读取json字符串。 数据可以在1 mb和4 mb之间。 public static class WebRequestEx { public static string ExecuteRequestReadToEnd(this WebRequest req) { var resp = req.GetResponse(); using (var resps = resp.GetResponseStream()) { StringBuilder sb = new StringBuilder(); // read through the stream loading up the string builder using (var respRdr = new StreamReader(resps)) { //return respRdr.ReadToEnd(); while (!respRdr.EndOfStream) { […]

C#阻止从其他线程访问所有对象方法

我有一个对象,一次只能由一个Thread使用。 例如,我的对象包含3个方法A , B和C ,如果线程访问方法A ,我想锁定对象(所有方法/属性都被锁定)。 主要的困难是我无法修改该对象的代码。 我必须阻止multithreading访问我调用对象的位置。 我的第一个想法是使用单例模式,但我没有设法让它工作!

.net消息循环

任何人都可以帮助解释如何在WPF中与消息循环交互? 我知道如何使用它 System.Windows.Threading.Dispatcher.Run() 现在,我只需要一种方法来调用它。 我有一个while循环,我想从它处理消息循环中的消息。 while (state == DebuggerStaus.Waiting) { Thread.Sleep(10); //>> Here I want to call a message loop << } 等待你的建议。 最好的祝福。 PS我需要能够在线程处于while循环时将方法INVOKE引入此线程。 这是我的主要目标。

ReaderWriterLockSlim.EnterUpgradeableReadLock()与Monitor.Enter()基本相同吗?

所以我的情况是,我可能有很多次读取,只偶尔写入多个线程之间共享的资源。 很久以前我读过有关ReaderWriterLock ,并且已经阅读了有关ReaderWriterGate ,该内容试图缓解许多写入特朗普的内容并损害性能的问题。 但是,现在我已经意识到ReaderWriterLockSlim …… 从文档中,我相信在任何时候都只能有一个“可升级模式”的线程。 在我使用的唯一访问是EnterUpgradeableReadLock() (适用于我的场景)的情况下,那么只是坚持使用lock(){}会有很大的不同吗? 这是摘录: 如果已有线程处于可升级模式,有线程等待进入写入模式,或者如果写入模式中存在单个线程,则尝试进入可升级模式的线程会阻塞。 或者,递归策略对此有何影响?

Windows服务定期生成一个最大的线程

我已经阅读了数百页并且现在使用了这么多样本,我完全感到困惑。 大多数示例似乎针对以下内容: 让一个计时器产生一个新的线程,它将完成一些工作,具有无限的线程 产生特定数量的线程,每个线程都有一个执行某些操作的计时器 做一些工作 我想要完成的是: 让计时器运行以定期生成一个线程 此线程可能需要或可能不会超过计时器滴答 限制可以生成多少个线程 线程完成后,将线程返回,以便再次使用 每个线程中的工作是彼此独立的,并且可以在异步中运行(这并不重要) 作为类比,我希望我的应用程序像一艘有10条钓鱼线的渔船一样工作。 在开始时你输出一个(按需),然后另一个,依此类推。 在任何给定时间,水中可以有0到10条钓鱼线。 每当捕获一条鱼时,线路就会被拉起并准备好再次施放(如果需要的话)。 听起来我应该使用ThreadPool? 我还认为为了保持简单,我应该生成一个线程,如果没有工作,立即返回它(即从某个表中选择count,如果count为0,则返回线程),而不是试图聪明地弄清楚如果我需要产卵,因为有需要。 一般情况下,当系统安静时,它将不断产生一个线程,看到没有工作然后返回,但在繁忙时间,线程可能会被使用到极限,系统将继续失败生成新线程,直到完成后再次返回一个或多个线程。 我已经尝试过System.Threading和Semaphores以及WaitHandles,但这一切都让人非常困惑。 我没有代码可以显示,因为我继续删除并重新开始,采用不同的方法。 任何帮助,将不胜感激。 我在C#2010开发。

Unity3d中的multithreading脚本调用

我试图在Unity3d中实现multithreading脚本执行,但似乎Unity库没有办法提供,我们必须使用Mono提供的System.Threading。 但他们提到Unity Scripting不是线程安全的。 我可以使用System.threading或其他独立于平台的API在Unity3D中安全有效地实现multithreading吗? 另外,我如何确保脚本并行运行? 一个例子或链接将受到高度赞赏。 问候

contextswitchdeadlock

在VS 2008中调试我的程序时,我遇到了以下错误: CLR无法从COM上下文0x34fc1a0过渡到COM上下文0x34fc258 60秒。 拥有目标上下文/公寓的线程很可能是执行非抽空等待或处理非常长时间运行的操作而不抽取Windows消息。 这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随时间不断累积。 为了避免这种情况 它似乎是死锁,即使代码只包含一个简单的C#计时器:请参阅下面的代码段: private void RequestWork() { // The timer will be re-intialised if there are still no wating jobs in the database StopTimer(); // assign all the threads some work InitialiseTimer(); } /// /// Initialise a timer with a timer interval configured from app.config. Enable the timer and /// […]

在尝试启动多个线程时,索引超出了数组的范围

我有这个代码,它给了我一个“索引超出了数组的范围”。 我不知道为什么会发生这种情况,因为变量i应该总是小于数组bla的长度,因此不会导致此错误。 private void buttonDoSomething_Click(object sender, EventArgs e) { List t = new List(); string[] bla = textBoxBla.Lines; for (int i = 0; i some_thread_funmction(bla[i]))); t[i].Start(); } } 有人能告诉我如何解决这个问题,为什么会发生这种情况。 谢谢!

为什么.Net没有Thread.Start()的通用版本?

我想知道为什么.Net没有启动线程的通用方法。 例如,我们开始像以下一样的线程…. Thread th = new Thread(SayHello); th.Start(“Hello”); private static void SayHello(object obj) { string str = obj as string; Console.WriteLine(str); } 我们为什么不能拥有,我的意思是.Net团队不考虑将其作为通用的? 跟随…… Thread th = new Thread(SayHello); 因为很多次我将值类型传递给线程启动时我必须进行装箱/拆箱。