Tag: multithreading

从UI调用System.Threading.Thread时锁定挂起

编辑:请查看问题历史记录,以保持未解决的问题,以免使评论无效。 我点击执行某些代码的按钮,它创建一个线程(System.Threading.Thread)。 当我重新点击开始进程的按钮时,它会挂起并冻结ui。 可能是什么原因? public partial class ucLoader : UserControl { //lock object for whole instance of class ucLoader private object lockUcLoader = new object(); //bringing info from ui private void btnBringInfo_Click(object sender, EventArgs e) { lock (lockUcLoader) { btnBringInfo_PerformClick(false); } } //using this method because it could be called when even button not visible […]

具有动态maxCount的SemaphoreSlim

我遇到了一个问题,我需要限制对另一个Web服务器的调用次数。 它会有所不同,因为服务器是共享的,也许它可能有更多或更少的容量。 我在考虑使用SemaphoreSlim类,但没有公共属性来更改最大计数。 我应该将我的SemaphoreSlim类包装在另一个将处理最大计数的类中吗? 有没有更好的方法? 编辑: 这是我正在尝试的: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Semaphore { class Program { static SemaphoreSlim _sem = new SemaphoreSlim(10,10000); static void Main(string[] args) { int max = 15; for (int i = 1; i <= 50; i++) { new Thread(Enter).Start(new int[] { i, […]

线程通知另一个例外的thead

ThreadA生成ThreadB。 ThreadB抛出exception。 ThreadA如何知道这个exception? using System; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ThreadStart threadDelegate1 = new ThreadStart(MyClass1.DoThis); Thread ThreadA = new Thread(threadDelegate1); ThreadA.Start(); Thread.Sleep(100000); // this thread is doing something else here, sleep simulates it } } class MyClass1 { public static void DoThis() { try { ThreadStart threadDelegate1 […]

async vs threading,何时使用每个选项?

这个页面, http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx ,在线程部分,说一个异步方法不在其他线程中运行,如果我想使用其他线程,我会使用Task.Run。 所以我理解异步和线程是两个不同的东西,每个选项都适用于某些情况。 我想知道何时更好地使用异步,何时更好地使用线程。 谢谢。

C#中长时间运行任务的进度条

我的应用程序运行一些可能需要很长时间的数据库查询。 在执行这些查询时,我的应用程序似乎冻结,看起来应用程序已停止工作。 我需要使用进度条来避免这个问题,但我不确定如何预测查询执行所需的时间。 运行查询的代码如下 private void CheckSsMissingDate() { while (DateTime.Parse(time) ='” + tempTime + “‘”,ssCon); var dr = cmd.ExecuteReader(); var count = 0; while (dr.Read()) { ssChkDate = (dr[“Date_Time”].ToString()); conssChkDate = DateTime.Parse(ssChkDate).ToString(“yyyy-MM-dd HH:mm:ss”); tempTime = Convert.ToDateTime(ssChkDate); tempTime = tempTime.AddMinutes(15); TValue1 = (dr[“Value1”].ToString()); TValue2 = (dr[“Value2”].ToString()); TValue3 = (dr[“Value3”].ToString()); TValue4 = (dr[“Value4”].ToString()); TValue5 = (dr[“Value5”].ToString()); TValue6 […]

同时运行x个Web请求

我们公司有一个Web服务,我想通过我自己的C#中的HTTPWebRequest客户端发送XML文件(存储在我的驱动器上)。 这已经有效了。 Web服务同时支持5个同步请求(一旦服务器上的处理完成,我就从Web服务获得响应)。 每个请求处理大约需要5分钟。 投掷太多请求(> 5)会导致我的客户超时。 此外,这可能导致服务器端的错误和不连贯的数据。 在服务器端进行更改不是一个选项(来自不同的供应商)。 现在,我的Webrequest客户端将发送XML并使用Webrequest等待响应result.AsyncWaitHandle.WaitOne(); 但是,这样,虽然Web服务支持5,但是一次只能处理一个请求。我尝试使用Backgroundworker和Threadpool但是它们同时创建了太多请求,这使得它们对我没用。 有什么建议,怎么可以解决这个问题? 用5个线程创建我自己的Threadpool ? 有什么建议,如何实现呢?

使用任务的经典永无止境的线程循环?

给定是一种非常常见的线程场景: 宣言 private Thread _thread; private bool _isRunning = false; 开始 _thread = new Thread(() => NeverEndingProc()); thread.Start(); 方法 private void NeverEndingProc() { while(_isRunning) { do(); } } 可能在异步tcp侦听器中使用,它等待回调,直到它通过让线程用完而停止( _isRunning = false )。 现在我想知道:是否有可能与Task做同样的事情? 使用CancellationToken ? 或者仅针对预期结束和报告状态的程序的Task ?

MultiThreading COMObject和UI线程(C#)

这是我在这里的第一篇文章,实际上我通常用你可以在这里找到的很棒的post数据库来解决我的所有问题。 但我现在卡住了: 我正在研究一个跟随MVVM的项目,包括一个COM对象。 正如我在研究期间所读到的那样,我理解COM对象只能从创建它的线程中访问。 我的COM对象实现以下接口 interface IComUpdate { void Update(); } 所以当我创建我的COM对象时,每次有更新(我不知道什么时候,它是随机的)时,COM服务器将调用我实现的COM对象类的Update() 。 我的目标是创建一个不同的线程,命名一个COM对象线程,其中COM对象独立于我的UI线程存在,所以每次有更新时,我都在与UI线程不同的线程中处理它。 实际上它正在工作: 在我的ViewModel的开头,我创建了一个特定对象的集合。 这个对象,我们称之为ModelObj ,是模型的一部分,它定义了一个静态构造函数,除了初始化一些变量之外,应用程序还为COM对象创建并启动一个新线程: Thread t = new System.Threading.Thread(() => { System.Threading.Thread.CurrentThread.Name = “Thread of COM Object”; IComUpdate myComObj; myComObj = (IComUpdate)Activator.CreateInstance(blabla); Application.Run(); }); t.SetApartmentState(ApartmentState.STA); t.Start(); 它实际上工作得很好,在我的COM对象的Update()实现中,我实际上看到该线程是刚创建的线程而不是UI线程。 现在的问题是:我创建的ModelObj实现了INotifyPropertyChanged接口。 我的想法如下:每次COM对象收到更新时,我处理来自COM对象线程的数据,并从此线程更新我的ModelObj实例的某些属性,因此这些属性将引发我的ModelObj的属性更改和UI线程将更新用户界面。 如果UI更新花费太多时间,我可能会错过一些Update()出现在屏幕上,但COM对象会将它们记录在我的ModelObj实例中,因此UI捕获所有更新并不是很重要,我只是没有希望COM对象必须等待更新UI才能再次调用。 我阅读了很多post,然后认为我的RaisePropertyChanged(“property”)会失败。 实际上甚至在COM对象的线程中, RaisePropertyChanged成功执行,因此跟踪我的代码,我看到它切换到我的ViewModel程序集 // Here I’m still in the thread of […]

使用剪贴板的C#multithreading应用程序

我正在研究multithreading应用程序,我遇到了必须使用剪贴板的问题(我正在使用Qlikview API – 我需要将表复制到excel中)问题是我认为会发生什么是这样的:在线程#1上我打开QW文档并复制表,在我将它粘贴到excel表之前,线程#2出现并使用剪贴板从其文档中复制表。 我很好奇是否可以使用multithreading应用程序中的剪贴板? 我已经阅读了有关使用剪贴板的各种事情,我理解的唯一明确的事情是该方法必须是STA(?)。 所以我现在很困惑。 谢谢

使用WebClient下载多个文件时无限循环

概念:我正在制作一个从给定URL下载文件的C#应用​​程序。 文本框,url添加,文件下载,每个事件都以正确的方式发生。 我正在尝试重新创建此程序以逐个下载多个文件。 我有一个带有一个url / line的文本框,解析正确,我在字符串数组中放置了所有链接,放在文本框中。 然后它开始下载异步,我想让它一个接一个地下载,所以我在foreach循环中进行了一个while循环,因为我不想在下一个url之前直到当前的下载完成。 问题是:我进入一个无限循环(虽然我之前做了这个工作(idk如何),如果我在while循环中放置了一个消息框(注意:我在一分钟前重试过,这次没有做到这一点) )。 我只是展示代码片段: foreach (string url in urllist) { isdonwloaded = false; string filename = url.Split(‘/’).Last(); label3.Text = filename; webclient.DownloadFileAsync(new Uri(url), @”C:\Users\Krisz” + @”\” + filename); while (!isdonwloaded) // this was the first idea, but with webclient.IsBusy it did the same thing { // MessageBox.Show(counter); Thread.Sleep(1000); label8.Text = […]