Tag: multithreading

在ASP.NET中并行执行.NET HttpWebRequests的建议

我有一个ASP.NET MVC Web应用程序,可以对其他服务器进行REST样式的Web服务调用。 我有一个场景,我正在对两个单独的服务进行两次HttpWebRequest调用。 我需要他们两个完成继续,但他们的顺序无关紧要。 它们可能每个需要1-2秒,我现在按顺序运行它们。 并行运行会减少用户响应时间,但最好的方法是什么? 在研究这个时,我可以想到几个选择: 在主线程上执行一个请求,并为另一个请求启动第二个线程。 应该创建新线程还是使用线程池? 如果我使用游泳池,我该如何调整尺寸? 另外,不知道如何将线程重新连接在一起(例如使用ThreadPool.RegisterWaitForSingleObject )? 尝试并利用内置的IAsyncResult支持一个或两个请求。 同样,不确定异步请求在哪些线程上执行,因此不确定如何调整线程池的大小。 如何将IAsyncResult加入我的主线程? 所有的例子我都在回调中找到了进程信息,但是我可以在主线程中等待并使用IsCompleted属性? 我需要找到一个既能运作又能大规模运行的解决方案。 这就是我担心线程池大小的原因。 我不愿意阻止请求,因为他们正在等待可用的线程。

MenuStrip和ToolStrip上的“红十字”问题

我有一个软件在许多机器上运行良好,虽然在一台机器上有一个问题似乎偶尔发生,但MenuStrip和ToolStrip都显示为一个空白的白色背景,上面有红叉,作为自定义控件如果你创建了一个null对象。 这在我调试时不会发生,我不知道如何重新发生问题,但它确实发生了。 我想知道是否有人知道可能是什么问题? 它是.NET框架的版本吗? 谢谢

在一个线程上创建的C#控件不能作为另一个线程上的控件的父级

我正在运行一个线程,该线程抓取信息并创建标签并显示它,这是我的代码 private void RUN() { Label l = new Label(); l.Location = new Point(12, 10); l.Text = “Some Text”; this.Controls.Add(l); } private void button1_Click(object sender, EventArgs e) { Thread t = new Thread(new ThreadStart(RUN)); t.Start(); } 有趣的是,我有一个以前的应用程序有一个面板,我曾经使用线程添加控件没有任何问题,但这一个不会让我这样做。

尝试调用委托时出现“方法不受支持”错误

我有一个函数Run(string, string[]) ,我想在一个单独的线程上运行,所以我使用委托和BeginInvoke : private Func<string, string[], Stack> runner; public MainPage() { runner = Run; } private void btnStep_Click(object sender, RoutedEventArgs e) { // snip runner.BeginInvoke(tbCode.Text, GetArgs(), null, null); // Exception here // snip } private Stack Run(string program, string[] args) { return interpreter.InterpretArgs(parser.Parse(lexer.Analyse(program)), args); } 但是,我得到NotSupportedException was unhandled by user code Specified method is […]

.NET – 有没有办法创建非静态线程方法?

有没有办法在.NET上创建非静态线程方法? 请给我看代码。 以下代码不起作用: ThreadStart ts = delegate {drawFloorAround(); }; public void drawFloorAround() { … } 给出此错误 – >“字段初始值设定项不能引用非静态字段,方法或属性”。 如果我改变方法做静态,它的工作原理。 但我不想。

为什么来自线程教程的MSDN示例崩溃?

来自MSDN “线程教程”的示例4 以下代码错误出现在“—错误就在这里—”的行中。 怎么了? using System; using System.Threading; public class MutexSample { static Mutex gM1; static Mutex gM2; const int ITERS = 100; static AutoResetEvent Event1 = new AutoResetEvent(false); static AutoResetEvent Event2 = new AutoResetEvent(false); static AutoResetEvent Event3 = new AutoResetEvent(false); static AutoResetEvent Event4 = new AutoResetEvent(false); public static void Main(String[] args) { Console.WriteLine(“Mutex Sample […]

如何获得任务并行库使用的最大并行度?

我想使用Parallel.invoke。 如果我分配20个并行任务,则只有8个并发运行。 我的CPU是http://ark.intel.com/products/47925 ,报告的线程数是8.我假设可以并行运行的任务数与线程的cpu数有关。 我不想创建比线程数更多的任务。 我怎么知道c#中的线程数? 我尝试查询ParallelOptions.MaxDegreeOfParallelism,我得到的只是-1。

CancellationTokenSource的行为不符合预期

在这种情况下预期的是,如果用户通过按Enter键取消任务,则ContinueWith挂钩的另一个任务将运行,但事实并非如此,因为尽管在ContinueWith显式处理显然不是,但仍然抛出了AggregateException被执行。 有关下面的任何说明吗? class Program { static void Main(string[] args) { CancellationTokenSource tokensource = new CancellationTokenSource(); CancellationToken token = tokensource.Token; Task task = Task.Run(() => { while (!token.IsCancellationRequested) { Console.Write(“*”); Thread.Sleep(1000); } }, token).ContinueWith((t) => { t.Exception.Handle((e) => true); Console.WriteLine(“You have canceled the task”); }, TaskContinuationOptions.OnlyOnCanceled); Console.WriteLine(“Press any key to cancel”); Console.ReadLine(); tokensource.Cancel(); task.Wait(); } }

ReactiveUI 6异步命令未在WPF应用程序中的后台线程上运行

视图模型 public class MyViewModel:ReactiveObject, IRoutableViewModel{ private ReactiveList _appExtensions; public MyViewModel(IScreen screen){ HostScreen = screen; AppExtensions = new ReactiveList(); GetApplicationExtensions = ReactiveCommand.CreateAsyncTask(x => _schemaService.GetApplicationExtensions()); // returns a Task<IEnumerable> GetApplicationExtensions .ObserveOn(RxApp.MainThreadScheduler) .SubscribeOn(RxApp.TaskpoolScheduler) .Subscribe(p => { using (_appExtensions.SuppressChangeNotifications()) { _appExtensions.Clear(); _appExtensions.AddRange(p); } }); GetApplicationExtensions.ThrownExceptions.Subscribe( ex => Console.WriteLine(“Error during fetching of application extensions! Err: {0}”, ex.Message)); } // bound […]

线程安全使用锁定助手(关于内存障碍)

通过锁定助手,我指的是一次性对象,通过using语句可以实现锁定。 例如,考虑Jon Skeet的MiscUtil中 SyncLock类的典型用法: public class Example { private readonly SyncLock _padlock; public Example() { _padlock = new SyncLock(); } public void ConcurrentMethod() { using (_padlock.Lock()) { // Now own the padlock – do concurrent stuff } } } 现在,请考虑以下用法: var example = new Example(); new Thread(example.ConcurrentMethod).Start(); 我的问题是这个 – 因为example是在一个线程上创建的,而ConcurrentMethod是在另一个线程上调用的,所以ConcurrentMethod的线程无法忽略_padock在构造函数中的赋值(由于线程缓存/读写重新排序),因此抛出NullReferenceException (在_padLock本身)? 我知道使用Monitor / lock会带来内存障碍,但是当使用这些锁定助手时,我无法理解为什么会有这样的障碍。 在这种情况下,据我所知,构造函数必须被修改: […]