一一影视网站源码,app推广拉新公司,企业网站功能模块设计,怎么在百度知道做公司网站一、invoke和BeginInvoke的作用 invoke和begininvoke方法的初衷是为了解决在某个非某个控件创建的线程中刷新该控件可能会引发异常的问题。说的可能比较拗口#xff0c;举个例子#xff1a;主线程中存在一个文本控件#xff0c;在一个子线程中要改变该文本的值#xff0c;此…一、invoke和BeginInvoke的作用 invoke和begininvoke方法的初衷是为了解决在某个非某个控件创建的线程中刷新该控件可能会引发异常的问题。说的可能比较拗口举个例子主线程中存在一个文本控件在一个子线程中要改变该文本的值此时会有可能引发异常。windows GUI编程有一个规则就是只能通过创建控件的线程来操作控件的数据否则就可能产生不可预料的结果。
二者的使用情况有两种
1.在控件下应用实例类型是个control例如button等
2.在委托下进行使用实例对象是一个委托类型在使用时候会跳到当前线程。
invoke和begininvoke的区别
1、Invoke() 调用时Invoke会阻止当前主线程的运行等到 Invoke() 方法返回才继续执行后面的代码表现出“同步”的概念。 2、BeginInvoke() 调用时当前线程会启用线程池中的某个线程来执行此方法BeginInvoke不会阻止当前主线程的运行而是等当前主线程做完事情之后再执行BeginInvoke中的代码内容表现出“异步”的概念。在想获取 BeginInvoke() 执行完毕后的结果时调用EndInvoke() 方法来获取。而这两个方法中执行的是一个委托。
二、Invke用法示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{public delegate void test(string s1);class Program{static void Main(string[] args){test tt new test(t1);Thread thread new Thread(() {tt.Invoke(你好);});thread.Start();string obj Thread.CurrentThread.ManagedThreadId.ToString();Console.WriteLine(主线程的ID : obj);Console.Read();}static void t1(string s1){string obj Thread.CurrentThread.ManagedThreadId.ToString();Console.WriteLine(s1支线程的ID :obj);}}提示本人准备建立一个技术交流群会将日常学习工作中遇到的问题和解决方案进行分享同时也会将代码和学习资料上传进去有什么不懂的问题可以咨询我vSJS66-12
生活所迫打个广告本人也代购莆田鞋不是中间商工厂直接取货价格优惠质量保证都是我自己前去挑选可以视频选购验货希望大家支持赚点生活费vSJS66-12
三、BeginInvoke用法示例
invoke和begininvoke对比
1.invoke用法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{public delegate void test(string s1);class Program{static void Main(string[] args){test tt new test(t1);tt.Invoke(你好);for (int i 0; i 300; i){Console.Write(3);}Console.Read();}static void t1(string s1){for (int i 0; i 300; i){Console.Write(2);}string obj Thread.CurrentThread.ManagedThreadId.ToString();Console.WriteLine(s1支线程的ID :obj);}}
}由结果可以看出invoke是依次按顺序向下执行
2.beginInvoke用法
首先介绍一下begininvoke的参数其中作重要的就是后两个参数这里使用了BeginInvoke方法的最后两个参数如果被调用的方法含有参数的话这些参数将作为BeginInvoke的前面一部分参数就是 传入调用方法的参数如果没有参数BeginInvoke就只有两个参数。第一个参数是回调方法委托类型这个委托只有一个参数就是IAsyncResult,如MethodCompleted方法所示。当method方法执行完后系统会自动调用MethodCompleted方法传入的其实也是调用方法的返回类型BeginInvoke的第二个参数需要向MethodCompleted方法中传递一些值一般可以传递被调用方法的委托类型。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{public delegate void test(string s1);class Program{static void Main(string[] args){test tt new test(t1);tt.BeginInvoke(111, (a) {for (int i 0; i 300; i){Console.Write(1);}}, null);for (int i 0; i 300; i){Console.Write(3);}Console.Read();}static void t1(string s1){for (int i 0; i 300; i){Console.Write(2);}string obj Thread.CurrentThread.ManagedThreadId.ToString();Console.WriteLine(s1支线程的ID :obj);}}
}由运行结果可以知道begininvoke可以继续执行调用方法后的函数关于begininvoke的具体用法可以参考该文章Delegate的BeginInvoke()_begininvoke参数-CSDN博客
例子
static void Main(string[] args){Console.WriteLine(主线程的ID: Thread.CurrentThread.ManagedThreadId);//标记显示主 线程IDSayHello sayhello new SayHello(Say);IAsyncResult iResultsayhello.BeginInvoke(Olive,new AsyncCallback(Result), sayhello);//三个参数1、Say函数的参数2、AsyncCallback类型的委托异步操作结束后执行的委托函数3、将sayhello对象作为状态参数在Result函数中会有用到该参数Console.ReadKey();}//AsyncCallback委托所执行的函数private static void Result(IAsyncResult iasyncresult){SayHello sayhello (SayHello)iasyncresult.AsyncState;//获取IAsyncResult对象的AsyncState的属性即为Delegate.BeginInvoke()的第三个参数即sayhello。string s sayhello.EndInvoke(iasyncresult);Console.WriteLine(s ------好了异步调用到这里已经结束了);}private static string Say(string name){Console.WriteLine(Hello!-------- name);Console.WriteLine(当前的线程ID为 Thread.CurrentThread.ManagedThreadId);return I Love you name;}
提示1.begininvoke的返回值类型为IAsyncResult 并且返回值会继续作为参数传入后续的AsyncCallback回调函数中Result。
2.函数的实际返回值需要通过EndInvoke进行获取
参考文章
控件和delegate的Invoke、BeginInvoke用法总结及基本逻辑_richtextbox1.begininvoke_勉之1.2.6的博客-CSDN博客C# 关于Invoke(详解_c# invoke-CSDN博客
BeginInvoke 用法 2 - 异步返回_begininvoke用法-CSDN博客
C#学习笔记--BeginInvoke和EndInvoke的基本用法-CSDN博客