Tag: begininvoke

为什么Dispatcher.BeginInvoke为ThreadStart解包TargetInvocationException而不为Action解包?

考虑以下两个应用程序: 1: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.Dispatcher.UnhandledException += Dispatcher_UnhandledException; } void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { System.Diagnostics.Debug.WriteLine(e.Exception.GetType()); } private void Button_Click(object sender, RoutedEventArgs e) { this.Dispatcher.BeginInvoke((ThreadStart)delegate { throw new AccessViolationException(“test”); }, DispatcherPriority.Input); } } 2: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.Dispatcher.UnhandledException += […]

Windows Phone:如何判断Deployment.Current.Dispatcher.BeginInvoke何时完成?

我试图通过将数据加载部分放入后台线程而不是在页面加载时在前台运行来使WP7应用程序中的页面UI更具响应性。 线程代码基本上通过一些数据工作,并将项添加到可观察集合中; 为了避免exception问题,我执行以下操作: Deployment.Current.Dispatcher.BeginInvoke(() => { _events.Add(_newItem); }); 以便在UI线程中完成将项添加到集合中。 我现在遇到的问题是,代码的后续部分需要对集合执行foreach ,以便找出插入新项目的位置而不是仅添加它。 不幸的是,我发现UI线程有时可以执行其添加,而我在foreach循环中,立即打破foreach。 从我已经完成的阅读中,看起来一种方法是调用EndInvoke()以阻止后台线程,直到完成UI部分。 不幸的是,看起来Wp7 / Silverlight实现不支持EndInvoke。 关于如何在开始foreach之前检查Add已经完成的任何建议? 谢谢。 菲利普

Invoke和BeginInvoke

问候,我正在用C#开发一些应用程序。 目前我正在处理线程,我有一个问题,我在脑海中。 Invoke和BeginInvoke有什么区别? 我读了一些post,我在这里找到了一些有用的信息: 这里 但是,以下代码中的Invoke和BeginInvoke之间有什么区别: private void ProcessRoutine() { for (int nValue = StartFrom; nValue <= EndTo; nValue++) { this.Invoke(this.MyDelegate, nValue); //this.BeginInvoke(this.MyDelegate, nValue); } MessageBox.Show("Counting complete!"); } private void MessageHandler(int progress) { lblStatus.Text = lblStatus.Text = "Processing item: " + progress.ToString(); progressBar1.Value = progress; } 其中MyDelegate是对MessageHandler函数的引用。 我注意到使用BeginInvoke lblStatus.Text没有刷新,使用Invoke刷新标签。 另外我知道Invoke等待它的执行完成。 我感兴趣的最重要的案例是为什么在这种情况下刷新标签文本有所不同。

匿名方法作为BeginInvoke的参数?

为什么不能将匿名方法作为参数传递给BeginInvoke方法? 我有以下代码: private delegate void CfgMnMnuDlg(DIServer svr); private void ConfigureMainMenu(DIServer server,) { MenuStrip mnMnu = PresenterView.MainMenu; if (mnMnu.InvokeRequired) { mnMnu.BeginInvoke((CfgMnMnuDlg)ConfigureMainMenu, new object[] { server}); } else { // Do actual work here } } 我试图避免宣布代表。 为什么我不能写下面的东西呢? 或者我可以,我只是无法弄清楚正确的语法? 以下目前生成: 参数类型’System.Delegate’不能赋予参数类型’匿名方法’ 好吧,这当然是正确的,但是我可以使用其他一些语法来做到这一点(避免为了使用BeginInvoke()而声明一个单独的委托吗? (能够做到这一点将完全符合使用anon方法/ lamdas代替显式委托的概念,这些委托在其他地方工作得非常干净。) private void ConfigureMainMenu(DIServer server,) { MenuStrip mnMnu = PresenterView.MainMenu; if (mnMnu.InvokeRequired) { mnMnu.BeginInvoke( […]

beginInvoke,GUI和线程

我有两个线程的应用程序。 其中一个(T1)是主GUIforms,另一个(T2)是循环中的function。 当T2得到一些信息时必须用GUIforms调用函数。 我不确定我做得对。 T2调用函数FUNCTION,以GUIforms更新某些内容。 public void f() { // controler.doSomething(); } public void FUNCTION() { MethodInvoker method = delegate { f(); }; if ( InvokeRequired ) { BeginInvoke( method ); } else { f(); } } 但现在我必须宣布两个function。 它如何只使用一个function? 或者它是如何正确的。

Dispatcher Invoke(…)vs BeginInvoke(…)混淆

我很困惑为什么我不能让这个测试计数器应用程序使用Count()方法在我的Dispatcher上使用“BeginInvoke”的2个(或更多个)同时运行的反文本框。 您可以通过Invoke替换BeginInvoke来解决问题。 但这并不能解决我的困惑。 这是我正在谈论的示例代码: public class CounterTextBox : TextBox { private int _number; public void Start() { (new Action(Count)).BeginInvoke(null, null); } private void Count() { while (true) { if (_number++ > 10000) _number = 0; this.Dispatcher.BeginInvoke(new Action(UpdateText), System.Windows.Threading.DispatcherPriority.Background, null); } } private void UpdateText() { this.Text = “” + _number; } }

在C#中做一些工作时显示进度条?

我想在做一些工作时显示进度条,但这会挂起UI并且进度条不会更新。 我有一个带有ProgressBar的WinForm ProgressForm,它将以一种大型方式无限期地继续。 using(ProgressForm p = new ProgressForm(this)) { //Do Some Work } 现在有很多方法可以解决这个问题,比如使用BeginInvoke ,等待任务完成并调用EndInvoke 。 或者使用BackgroundWorker或Threads 。 我在使用EndInvoke时遇到了一些问题,尽管这不是问题。 问题是你用来处理这种情况的最好和最简单的方法,你必须向用户显示程序正在运行而不是没有响应,以及如何使用最简单的代码来处理这个问题,这是有效的并且赢得了’ t泄漏,并可以更新GUI。 像BackgroundWorker需要有多个函数,声明成员变量等。然后你需要保持对ProgressBar表单的引用并处理它。 编辑 : BackgroundWorker不是答案,因为它可能是我没有获得进度通知,这意味着不会调用ProgressChanged因为DoWork是对外部函数的单个调用,但我需要继续调用Application.DoEvents(); 进度条保持旋转。 赏金是针对此问题的最佳代码解决方案。 我只需要调用Application.DoEvents()以便Marque进度条可以工作,而worker函数在Main线程中工作,并且它不会返回任何进度通知。 我从不需要.NET魔术代码来自动报告进度,我只需要一个比以下更好的解决方案: Action exec = DoSomethingLongAndNotReturnAnyNotification; IAsyncResult result = exec.BeginInvoke(path, parameters, null, null); while (!result.IsCompleted) { Application.DoEvents(); } exec.EndInvoke(result); 保持进度条活着(意味着不冻结但刷新品牌)