Tag: invoke

是不是一味地使用InvokeRequired只是不好的做法?

我是一名新手程序员,所以我可能在这里完全弄错了,但是这个问题让我更加困惑。 这实际上是这个问题的后续行动。 接受的答案是,您必须调用InvokeRequired以避免一些开销,因为您可能已经在UI线程上运行。 理论上,我同意它可以节省一些时间。 经过一些测试后,我发现使用Invoke的时间大约是正常调用操作的两倍(测试类似于设置标签文本n次,或者在RichTextBox中放置一个非常非常大的字符串)。 但! 然后有练习。 MSDN文档说: 此属性可用于确定是否必须调用invoke方法,如果您不知道哪个线程拥有控件,这可能很有用。 在大多数情况下,您确实知道何时尝试从另一个线程访问控件。 实际上,我能想到的唯一情况是,从一个可以被线程X调用的方法以及所有者线程访问控件时。 这对我来说是一个非常不可能的情况。 即使你真的不知道哪个线程试图操纵控件,也有一个事实是UI线程不必经常更新。 对于您的GUI,25-30 fps之间的任何内容都应该没问题。 在UI控件中进行的大多数更改所花费的时间远远少于毫秒。 因此,如果我理解正确,则必须检查是否需要调用的唯一情况是,当您不知道哪个线程正在访问控件时以及GUI更新需要超过大约40毫秒才能完成时。 然后我在http://programmers.stackexchange.com上询问了这个问题的答案。 这表明,当您不需要它时,您不应该忙于过早优化。 特别是如果它牺牲了代码的可读性。 所以这让我想到了一个问题:当你知道一个不同的线程访问一个控件时,你不应该只使用invoke,并且只有当你知道你的UI线程可以访问那段代码并且你发现它应该运行得更快,那么你应检查是否需要调用? PS:在校对我的问题之后,听起来真的像我在咆哮。 但实际上我只是好奇为什么InvokeRequired似乎被许多经验丰富的程序员过度使用。

何时在GUI对象上调用?

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

跨线程操作在Windows窗体中无效

任何人都可以帮助我,我有一个问题我正在尝试通过线程池让这个代码在后台工作,但我似乎无法让它工作,我一直得到这个错误: Cross-thread operation not valid: Control ‘ListBox3’ accessed from a thread other than the thread it was created on. 这是我正在使用的代码: private void DoWork(object o) { var list = ListBox3; var request = createRequest(TxtServer.Text, WebRequestMethods.Ftp.ListDirectory); using (var response = (FtpWebResponse)request.GetResponse()) { using (var stream = response.GetResponseStream()) { using (var reader = new StreamReader(stream, true)) { while […]

MethodInfo调用方法

我想调用具有某个属性的方法。 所以我循环遍历所有程序集和所有方法以使用我的属性查找方法。 工作正常,但是当我得到它的MethodInfo时,如何调用某个方法。 AppDomain app = AppDomain.CurrentDomain; Assembly[] ass = app.GetAssemblies(); Type[] types; foreach (Assembly a in ass) { types = a.GetTypes(); foreach (Type t in types) { MethodInfo[] methods = t.GetMethods(); foreach (MethodInfo method in methods) { // Invoke a certain method } } } 问题是我不知道包含该特定方法的类的实例。 所以我无法正确调用它,因为这些方法不是静态的。 我还想避免在可能的情况下创建此类的新实例。

C#从线程中调用的函数返回值

我有一个计算线程函数,它使用Invoke从其他线程调用消息函数,我希望计算线程从该消息函数获取值(值类型,如整数)。 我怎样才能做到这一点? 问题是我在Invoke(…)之后仍然得到x变量的旧值,我期望值为15 delegate void mes_del(object param); void MyThreadFunc() { … int x = 5; object [] parms = new object []{x}; Invoke(new mes_del(MessageFunc), (object)parms); … } void MessageFunc(object result) { int res = 15; (result as object[])[0] = res; } 我尝试了一些方法,比如使用object [],object作为参数但没有成功。 我虽然拳击/拆箱操作应该在这种情况下发生,但他们不会。 我是否应该像在.NET事件模式中那样使用辅助类型,并创建像类holder {public int x; }

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; } }

在处理控件时避免调用Invoke

我的工作线程中有以下代码(下面的ImageListView是从Control派生的): if (mImageListView != null && mImageListView.IsHandleCreated && !mImageListView.IsDisposed) { if (mImageListView.InvokeRequired) mImageListView.Invoke( new RefreshDelegateInternal(mImageListView.RefreshInternal)); else mImageListView.RefreshInternal(); } 但是,我有时会使用上面的Invoke方法获得ObjectDisposedException 。 看来控件可以在我检查IsDisposed和我调用Invoke 。 我怎么能避免这种情况?

使用C#MethodInvoker.Invoke()获取GUI应用程序……这样好吗?

使用C#2.0和MethodInvoker委托,我有一个GUI应用程序从GUI线程或工作线程接收一些事件。 我使用以下模式处理表单中的事件: private void SomeEventHandler(object sender, EventArgs e) { MethodInvoker method = delegate { uiSomeTextBox.Text = “some text”; }; if (InvokeRequired) BeginInvoke(method); else method.Invoke(); } 通过使用这种模式,我不会复制实际的UI代码,但我不确定的是这种方法是否合适。 特别是这条线 method.Invoke() 它是否使用另一个线程进行调用,或者它是否有点转换为直接调用GUI线程上的方法?

带有C ++布尔函数的C#DllImport无法正确返回

我在C ++ DLL中有以下function extern “C” __declspec(dllexport) bool Exist(const char* name) { //if (g_Queues.find(name) != g_Queues.end()) // return true; //else // return false; return false; } 在我的C#类中,我有以下内容: [DllImport(“Whisper.dll”, EntryPoint=”Exist”, CallingConvention=CallingConvention.Cdecl)] public static extern bool Exist(string name); 然而,每当我调用我的函数时,它总是返回true,即使我注释掉了我的小函数并使其返回false。 我觉得我的调用约定或P / Invoking我的DLL的任何其他问题都有问题,可能与字符串和const char *相对应,但是现在我完全无能为力。 我究竟做错了什么? 为什么它返回true而不是false? 编辑:我已经发现这与const char *或字符串无关,因为问题仍然存在于空函数中。 我试过改变Cdecl和StdCall之间的调用约定,但都没有正常工作。 我还设法调试我的DLL,它被正确调用,确实返回false,但一旦回到C#,它就会成真。 更改CharSet也没有任何效果。 我已经确保每次都为我的C#程序提供最新版本的DLL,所以这不应该是一个问题。 再一次,当我实际上返回false时,我完全不清楚为什么结果是真的。 EDIT2: SOReader为我提供了一个修复另一个重要问题的建议,请参阅我的评论。 可悲的是,它并没有解决退货问题。 EDIT3:我已经得出结论,将Exist(bool)的返回类型更改为(int)突然使它返回正确的数字(true […]