Tag: multithreading

关于在Thread中传递的局部变量

我很难理解以下程序的意外输出: class ThreadTest { static void Main() { for(int i = 0; i Console.Write(i)).Start(); } } 查询:在不同线程中运行的不同代码是否具有单独的堆栈? 如果是,那么变量应该保留它们的值,因为int是值类型?

WPF UI多任务处理

我正在以编程方式创建一些UI,这涉及一些繁重的处理。 基本上我想要的是在我的UI被构建/添加到窗口时运行加载器动画。 添加的UI是一些网格,一些图像被加载到它们中。 到目前为止,我已经尝试过BackgroundWorker,但由于我需要使用UI线程来添加我正在构建的UI,因此在添加的UI完成之前,加载器将无法启动/动画。 我也尝试过一些没有任何结果的异步方法。 我的最后一次尝试是这样的,但它仍然需要访问UI线程,这将最终冻结UI动画,直到工作完成 private async void begin() { await this.LongRunOpAsync(); } public Task LongRunOpAsync() { return Task.Run(() => { InitGrid(); stopLoadingScreen(); }); } 我可能会遗漏一些东西,但我不知道是什么,我也没有想到这样做。 任何帮助,将不胜感激。 编辑:有繁重工作的方法 private void makeIgrid() { Grid hostgrid = new Grid(); hostgrid.Name = “imagesHostGrid”; hostgrid.Width = 700; hostgrid.VerticalAlignment = VerticalAlignment.Top; hostgrid.HorizontalAlignment = HorizontalAlignment.Center; hostgrid.SetValue(Canvas.ZIndexProperty, 0); this.RegisterName(hostgrid.Name, hostgrid); Grid […]

线程参数被更改

当启动多个线程时,我正在解析的id参数有时是错误的。 这是我的创业公司: for (int i = 0; i WorkerThread(i)); thread.Start(); _threads.Add(thread); } 我的线程function: private void WorkerThread(int id) { Console.WriteLine(“[{0}] Thread started {1}”, DateTime.Now.ToLongTimeString(), id); } 此代码的输出是: [19:10:54] Thread start 3 [19:10:54] Thread start 9 [19:10:54] Thread start 4 [19:10:54] Thread start 12 [19:10:54] Thread start 11 [19:10:54] Thread start 3 [19:10:54] Thread start 12 [19:10:54] […]

您是否可以链接到使用BackgroundWorker的好示例,而无需将其作为组件放在表单上?

我记得很多年前(2005年)我在我的代码中使用BackgroundWorker而没有使用可视化组件,但是我不记得是什么(不幸的是我很忘记并且在我停止使用它之后很快忘记了所有内容) 。 也许我正在扩展BackgroundWorker类。 你能链接到这种方式使用BackgroundWorker的好例子吗?

挥发性使用的可重现的例子

我正在寻找一个可重现的示例,可以演示volatile关键字的工作原理。 我正在寻找一些工作“错误”的东西而没有标记为易变的变量,并且“正确”地使用它。 我的意思是一些示例,它将certificate执行期间的写/读操作顺序与变量未标记为volatile时的预期顺序不同,并且当变量未标记为volatile时不同。 我认为我得到了一个例子但是在其他人的帮助下我意识到它只是一段错误的multithreading代码。 为什么volatile和MemoryBarrier不会阻止操作重新排序? 我还发现了一个链接,它演示了volatile对优化器的影响,但它与我正在寻找的不同。 它表明对标记为volatile的变量的请求不会被优化。 如何在C#中说明volatile关键字的用法 这是我到目前为止的地方。 此代码未显示任何读/写操作重新排序的迹象。 我正在寻找一个会展示的。 using System; using System.Threading; using System.Threading.Tasks; using System.Runtime.CompilerServices; namespace FlipFlop { class Program { //Declaring these variables static byte a; static byte b; //Track a number of iteration that it took to detect operation reordering. static long iterations = 0; static object locker = […]

C#中的multithreadingNamePipeServer

你好 我想使用NamedPipeServerStream ,这是.NET 3.5中用于namedpipe通信的新function。 我想写multithreading管道服务器。 它是默认处理还是我应该为此编写代码。 我的管道服务器应该一次处理多个请求 任何解决方案或代码?

获取.NET中当前活动的托管线程列表?

对于“支持日志信息”类型的函数,我想枚举并转储活动的线程信息。 我很清楚竞争条件可能会使这些信息半不准确,但我想尝试获得最佳结果,即使它不是100%准确。 我查看了Process.Threads,但是它返回了ProcessThread对象,我想要一个Thread对象的集合,这样我就可以记录它们的名字,以及它们是否是后台线程。 是否有这样的集合可用,即使它只是我调用它时活动线程的快照? 即。 Thread[] activeThreads = ?? 注意,要说清楚,我不是在询问Process.Threads,这个集合给了我很多,但并不是我想要的全部。 我想知道我们的应用程序当前正在使用多少时间特定的命名线程(这意味着我将不得不考虑稍后连接两种类型的对象,但名称比开始时的CPU时间更重要。)

定时器可以自动收集垃圾吗?

当你使用一个Timer或一个只运行整个程序生命周期的Thread ,你是否需要保留对它们的引用以防止它们被垃圾收集? 请不要理会下面的程序可以将timer作为类中的静态变量,这只是一个展示问题的玩具示例。 public class Program { static void Main(string[] args) { CreateTimer(); Console.ReadLine(); } private static void CreateTimer() { var program = new Program(); var timer = new Timer(); timer.Elapsed += program.TimerElapsed; timer.Interval = 30000; timer.AutoReset = false; timer.Enabled = true; } private void TimerElapsed(object sender, ElapsedEventArgs e) { var timerCast = (Timer)sender; Console.WriteLine(“Timer […]

显示在其他线程中加载数据期间加载动画

我有一个运行数据库的应用程序。 当我在datagridview中加载表时,我的表单冻结了。 如何在加载表格期间确保平滑加载动画? 我为动画运行两个线程并将数据加载到表中,但动画仍然不能始终有效。 private volatile bool threadRun; private void UpdateTab() { // Create panel for animation Panel loadingPanel = new Panel(); // Label, where the text will change Label loadingLabel = new Label(); loadingLabel.Text = “Loading”; loadingPanel.Controls.Add(loadingLabel); this.Controls.Add(loadingPanel); // thread loading animation threadRun = true; Task.Factory.StartNew(() => { int i = 0; string labelText; […]

同时运行两个winform窗口

我有两个C#winform(.NET 4.0)表单,每个表单连续运行单独但类似的自动化任务。 区别在于它们是不同的流程/工作流程,但在它们如何操作以在项目中共享相同的资源(方法,数据模型,程序集等)方面相似。 两种forms都是完整的,但现在我不知道如何运行程序,以便每个窗口在启动时打开并独立运行。 部署后,该程序将“始终开启”。 这可能看起来有点基础,但我的大多数开发经验都是Web应用程序。 线程/等对我来说仍然有些陌生。 我已经研究过,但我发现的大多数答案都与用户交互和顺序用例有关 – 这只是一个系统连续运行两个不同的进程,需要独立地与世界进行交互。 我发现的潜在解决方案可能涉及multithreading,或者某种MDI,或者有些人建议使用DockPanelSuite(尽管处于超级企业环境中,下载第三方文件说起来容易做起来难)。 static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // Rather than specifying frmOne or frmTwo, // load both winforms and keep them running. Application.Run(new frmOne()); } }