Tag: begininvoke

为什么调度程序BeginInvoke失败,其中Control BeginInvoke在C#Windows窗体应用程序中成功?

我最初尝试使用Dispatcher类BeginInvoke方法在我的C#Windows窗体应用程序中的主UI线程上显示一个消息框。 当我使用该方法时,消息框没有出现 。 我在传递给BeginInvoke()的委托的主体内部设置了一个断点,它从未被命中。 我尝试使用Action委托和MethodInvoker委托。 两种情况都没有运气。 当我使用属于Form对象的BeginInvoke方法时,它工作正常 。 为什么Dispatch版本无声地失败(没有exception或错误消息)? 以下是两个不同的版本。 Dispatcher dispatcher = Dispatcher.CurrentDispatcher; // THIS FAILED. CONTEXT: Executing on worker thread. MethodInvoker theMethod = new MethodInvoker(delegate() { string msg = “Show this message on the main UI thread.”; MessageBox.Show(msg, “Message”); }); dispatcher.BeginInvoke(theMethod); this.BeginInvoke(theMethod); // ————————————————— // THIS WORKED. CONTEXT: Executing on worker thread. MethodInvoker […]

具有匿名委托的Dispatcher.Invoke适用于Silverlight但不适用于WPF

在Silverlight 4中,我有一个自定义服务类,它具有异步的Completed事件。 在Completed事件中,我获取返回的数据并通过以下方式调用populate方法: private void service_Completed(object sender, CompletedEventArgs args) { Dispatcher.BeginInvoke(() => populateInbox(args.Jobs)); } private void populateInbox(List jobs) { inbox.DataContext = jobs; } BeginInvoke在SL4中工作,但是当我将它移植到WPF时,我收到以下错误: 无法将lambda表达式转换为类型’System.Delegate’,因为它不是委托类型 我尝试将其更改为内联,匿名,参与代表: Dispatcher.BeginInvoke(delegate(List jobs) { inbox.DataContext = jobs; }); 但是,这会产生相同的编译时错误。 知道如何在WPF中使用它吗? 重构使用BackgroundWorker对我来说不是一个选择。

线程和套接字

我有以下内容: ThreadStart startThread = delegate { mySocket.StartListen(); }; mySocket现在循环在Listen()上,当我: new Thread(startThread).Start(); 这是StartListen: public void StartListen() { Object locker = new Object(); // Lock resources lock (locker) { S = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); S.Blocking = false; try { S.Bind(serverEP); S.Listen(1000); isListening = true; /* * While statement not required here because AcceptConnection() * method instructs […]

使用control.begininvoke后,UI仍然没有响应

我做了一个C#winforms应用程序。 现在我有一个有很多按钮的表单,它调用了大量的数字运算函数,其输出我在文本框中更新。 我调用textbox.begininvoke()方法,我将委托传递给更新文本框中文本的函数,但是当文本很大时,表单没有响应,因为我无法单击取消按钮。 没有任何办法可以使整个表格保持响应,并且更新也会不断发生。 我必须向用户显示数据,因为它即将到来,我无法缓冲整个事情并最终显示。 我还尝试实现自己的缓冲区并以特定的时间间隔显示数据,这对于少量文本很有用,但是大量的UI只是没有响应。 任何帮助? 谢谢 随着一些混乱的出现而更新问题 我在一个单独的线程上调用了数字运算function。 只要数据到达以更新文本框,该数字运算函数就会调用control.begininvoke函数 我的UI会显示,我看到输出即将到来,但是当数据很大时,我无法做任何其他活动,虽然我仍然可以看到UI

如何从BeginInvoke返回T值?

我想编写一个类来简化异步编程,比如string s = mylib.BeginInvoek(test,“1”); 这是我的代码: public T BeginInvokeExWithReturnValue(Func actionFunction) { ExecWithReturnType execWtihReturnValue = new ExecWithReturnType(actionFunction); IAsyncResult iar = execWtihReturnValue.BeginInvoke(new AsyncCallback(EndInvokeExWithReturnValue), execWtihReturnValue); // how to code here to return value } private void EndInvokeExWithReturnValue(IAsyncResult iar) { ExecWithReturnType execWtihReturnValue = (ExecWithReturnType)iar.AsyncState; execWtihReturnValue.EndInvoke(iar); } 这个BeginInvokeExWithReturnValue函数没有输入参数,但返回一个值,但我不知道如何从BeginInvokeExWithReturnValue函数返回一个值。 任何知道这一点的人,你能帮忙吗? 非常感谢。

调用EventHandler

我有以下EventHandler: private EventHandler _myEventHandler; public event EventHandler MyEvent { add { _myEventHandler += value; } remove { _myEventHandler -= value; } } 有人可以解释以下片段之间的区别吗? Snippet EventHandler(A): //Snippet A: if (_myEventHandler != null) { _myEventHandler(new MyEventArgs()); } Snippet BeginInvoke(B): //Snippet B: if (_myEventHandler != null) { _myEventHandler.BeginInvoke(new MyEventArgs(), ar => { var del = (EventHandler)ar.AsyncState; del.EndInvoke(ar); }, […]

BeginInvoke()是否运行单独的线程?

在我的WPF应用程序中,我想在非UI线程中做一些工作,以避免UI变得无响应。 为此我做了这个: var caller = new AsyncMethodCaller(this.SetPatternType); caller.BeginInvoke(_patterns, null, null); 代表被定义为, public delegate void AsyncMethodCaller(IEnumerable data); 我的问题是: BeginInvoke()是否创建了一个新线程并且回调SetPatternType在其中运行? 如果是这样,这个post能持续多久? 这种方法总的来说好吗? 如果没有,它有什么问题? 我可能面临哪些潜在的问题? 我正在使用C#4.0和Visual Studio 2010。 编辑: 我还需要一些关于这些的指导方针: 当我自己创建一个新线程时,我应该何时使用BeginInvoke() ? 什么时候应该使用DispatcherObject.Dispatcher.BeginInvoke()对象?

如何在Action上unit testingBeginInvoke

我正在寻找一种在Action方法上测试BeginInvoke的方法,因为该方法在后台线程上运行,无法知道它何时实际完成或调用回调方法。 我正在寻找一种方法来保持我的测试等待,直到在进行断言之前调用回调。 在下面的Presenter类中,您可以注意到我在后台线程上调用PopulateView,它在获取数据时更新视图,并且我正在尝试断言视图属性已正确初始化。 我正在使用NUnit和Moq。 public class Presenter { private IView _view; private IService _service; public Presenter(IView view, IService service) { _view = view; _service = service; Action action = PopulateView; action.BeginInvoke(PopulateViewCallback, action); } private void PopulateViewCallback(IAsyncResult ar) { try { Action target = (Action)ar.AsyncState; target.EndInvoke(ar); } catch (Exception ex) { Logger.Instance.LogException(“Failed to initialize view”, ex); […]

何时在GUI对象上调用?

使用C #Windows.Forms,必须在主/ GUI线程(需要Invoke / BeginInvoke)上运行Invalidate(),Refresh()等方法吗? 如何更改GUI对象的成员,例如添加/删除Points或更改Charting.Chart对象中的系列颜色? 我在工作线程中发生了一些这些更改,没有任何问题(所以我猜他们没问题?),但我试图区分哪些更改在GUI线程上需要明确,哪些更改可以在对象中发生工人线程。 有没有人有关于这个主题的指导的链接或书籍参考?

control.BeginInvoke()无法调用委托

我注意到control.BeginInvoke(委托)有时无法调用委托。 我知道BeginInvoke只是创建一个PostMessage,该消息稍后由应用程序处理(默认情况下,消息后限制为10,000)。 鉴于我们的应用程序不是很复杂,还有其他原因导致它无法执行委托吗? 我的代码如下所示。 class MyClass : Form{ private bool executing = false; private delegate void DelegateBar(string info, int total, bool status, object obj); private void Bar(string info, int total, bool status, object obj){ log(“Enterning Bar”); // Update something on UI executing = false; log(“Exiting Bar”); } public void foo(){ log(“Entering Foo”); executing = true; […]