Tag: multithreading

ASP.Net MVC应用程序中的线程安全全局变量

我需要在ASP.Net MVC应用程序中实现一个multithreading全局变量。 ConcurrentDictionary是理想的,但如何让我的应用程序中的每个用户会话都可以访问它? 这样的事情可以做到吗? public static class GlobalStore { public static ConcurrentDictionary GlobalVar { get; set; } } 我需要多个用户才能读取和写入此对象。

如何在C#中杀死线程?

我有一个线程打开一个MyMessageAlert类型的forms。 此表单是一个弹出窗口,在我调用它时打开。 它有一个定时器,在30秒后调用CloseWindow()方法。 m_messagAlert = new MyMessageAlert(); ParameterizedThreadStart thStart = new ParameterizedThreadStart(m_messagAlert.setMessage); Thread thread = new Thread(thStart); thread.Start(strMessage); //at this point, the MyMessageAlert form is opened. 我已经定义了一个类型线程列表: public List m_listThread; 每次我创建一个线程,我都将它添加到我的列表中: m_listThread.Add(thread); 当我关闭应用程序时,我希望打开的MyMessageAlert类型的forms将立即关闭(不等待30秒)。 问题是我无法阻止它! 我试图通过使用Abort()函数遍历列表来杀死它: foreach (Thread thread in m_listThread) { if (thread.IsAlive) thread.Abort(); } 但它没有帮助。

如何使用特定的TaskScheduler完成TaskCompletionSource.Task

当我调用TaskCompletionSource.SetResult时,如何在特定的TaskScheduler上完成TaskCompletionSource.Task的完成? 目前,我正在使用我从这篇文章借来的想法: static public Task ContinueOnTaskScheduler( this Task @this, TaskScheduler scheduler) { return @this.ContinueWith( antecedent => antecedent, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, scheduler).Unwrap(); } 因此,每当我将TaskCompletionSource.Task返回给调用者时,我现在返回TaskCompletionSource.Task.ContinueOnTaskScheduler(scheduler) 。 是否有可能以某种方式避免ContinueWith另一个间接层次?

C#/ WPF – 我无法从后台工作者更新UI

我有一个代码,使用Tweetsharp库从特定的Twitter帐户获取推文,创建自定义UserControl实例,并将推文文本发布到该UserControl然后将其添加到StackPanel 。 但是,我必须得到很多推文,似乎应用程序会在向StackPanel添加用户控件时冻结。 我尝试过使用BackgroundWorker ,但直到现在我还不幸运。 我的代码: private readonly BackgroundWorker worker = new BackgroundWorker(); // This ( UserControl ) is used in the MainWindow.xaml private void UserControl_Loaded_1(object sender, RoutedEventArgs e) { worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted; worker.RunWorkerAsync(); } private void worker_DoWork(object sender, DoWorkEventArgs e) { int usrID; var service = new TwitterService(ConsumerKey, ConsumerSecret); service.AuthenticateWith(AccessToken, AccessTokenSecret); […]

使用线程池限制最大线程数 – 尝试读取或写入受保护的内存错误

我正在使用Noseratio的一些报废代码,请访问https://stackoverflow.com/a/22262976/3499115 。 他写了它来刮取一个url列表,但是我正在使用它,但是在我正在使用的另一个网络爬虫MVC控制器中一次只渲染一个url。 每当我找到特定类型的链接时,我都会调用此代码,并且看起来多次这样做会导致内存不足。 也许解决方案是使用线程池并限制最大线程数,但我将如何对此代码执行此操作? 以下是调用webbrowser代码的Web爬网程序代码: public static HtmlDocument renderJavascript(string url) { HtmlDocument doc = new HtmlDocument(); // using webBrowserScrapper try { WebBrowserExt.SetFeatureBrowserEmulation(); // enable HTML5 var cts = new CancellationTokenSource((int)TimeSpan.FromMinutes(3).TotalMilliseconds); var task = WebBrowserScrapper.ScrapSitesAsync( url, cts.Token); task.Wait(); //Console.WriteLine(“Press Enter to exit…”); //Console.ReadLine(); doc.LoadHtml(task.Result); return doc; } catch (Exception ex) { while (ex is AggregateException […]

单独线程上的C#UI

我一直在各种论坛,教程或SO答案中看到建议在单独的线程上运行UI,然后是程序的其余部分以保持响应。 这在实践中是如何完成的? 这是否意味着编辑program.cs以在加载表单之前启动一个线程? 或者它是否意味着从表单内部激活的任何非平凡操作都会分叉一个线程并使用它? 还是一些设置? 你怎么用它?

同步线程访问和C#写入

我有一个用C#编写的multithreading端口扫描程序应用程序,我想在应用程序运行时将一些内容打印到控制台和日志文件。 出于这个原因,我有以下帮助器类,它可以很好地写入日志文件和控制台。 public class Output { private const string LOG_DIRECTORY = “Logs”; private readonly string LogDirPath = Path.Combine(Directory.GetCurrentDirectory(), LOG_DIRECTORY); private static Output _outputSingleton; private static Output OutputSingleton { get { if (_outputSingleton == null) { _outputSingleton = new Output(); } return _outputSingleton; } } public StreamWriter SW { get; set; } public Output() { EnsureLogDirectoryExists(); […]

列表在.NET中的不同线程之间共享

我在一个类中有一个静态List,它将被不同的线程访问,每个线程都从列表中添加,读取和删除它自己的唯一项。 我想知道我是否必须担心这个变量线程安全,因为即使线程之间共享相同的List对象,它们也只修改自己的唯一项

WriteableBitmap上的异步操作

我正在用WPF(C#)编写一个应用程序,它对一组Bitmaps进行长时间的操作。 为了使我的应用程序保持响应,我决定使用另一个线程来对位图执行操作,并在主UI线程中报告进度条的进度。 我认为BackgroundWorker会为我做任何事情,但看起来不会那么容易。 我有以下代码: public class ImageProcessor { public Collection Pictures { get; private set; } private BackgroundWorker _worker = new BackgroundWorker(); public ImageProcessor() { _worker.DoWork += DoWork; } public void DoLotsOfOperations() { _worker.RunWorkerAsync(); } private void DoWork(object sender, DoWorkEventArgs e) { // operations on Pictures collection } } 在运行时,我使用标准打开文件对话框将图像加载到Pictures集合中,然后调用DoLotsOfOperations()方法。 但是当我尝试访问单个位图的任何属性时,我得到InvalidOperationException:“调用线程无法访问该对象,因为不同的线程拥有它”。 这是真的 – 我加载了位图并在UI线程中填充了集合,我尝试在另一个线程中读取集合元素。 所以我尝试了不同的方法: […]

certificate代码示例失败,没有volatile

下面是一个C#代码示例,它是一个破坏的Java代码的逐字翻译(已certificate破坏(即第二个线程可能无法观察到sharedValue值的变化)至少在Mac OS X 10.9,Java 1.8(64位)上),Arrandale(1插槽x 2核x 2 HT = 4个HW线程)): using System; using System.Threading; class ThreadTest { /* volatile */ private int sharedValue; private void RunAsync() { while (this.sharedValue == 0); } private bool Test() { Thread t = new Thread(this.RunAsync); t.IsBackground = true; t.Start(); Thread.Sleep(10); // Yes I’m aware the operation is not atomic […]