如果使用多线程,应该会遇到这样的一个问题,在子线程中想调用主线程中(Form1)控件,提示报错!

可以使用Invoke方法调用。

this.Invoke(new MethodInvoker(() =>
{
this.rTxtLog.AppendText("在线程内调用主线程中控件 " + Environment.NewLine);
}));

异步委托学习,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace 线程与异步委托练习
{
class Program
{
//声明一个委托,
public delegate int AddFunDel(int a, int b);
static void Main(string[] args)
{
Console.WriteLine("主线程{0},已启动...", Thread.CurrentThread.ManagedThreadId);
#region 线程
////ParameterizedThreadStart 有参委托
////ThreadStart 无参委托
//Thread thread = new Thread(new ThreadStart(MyFun));
////设置线程名称 给程序员看的。
//thread.Name = "MyFun";
////设置为后台线程。当主线程被关闭时,后台子线程自动被关闭。
//thread.IsBackground = true;
////更改状态,并没有执行,只是告诉CPU,可以执行了。
//thread.Start();
#endregion #region 有参线程
////Thread thread2 = new Thread(new ParameterizedThreadStart(MyFun2));
//Thread thread2 = new Thread(a => {
// while (true)
// {
// Console.WriteLine("子线程{0},正在执行中。参数值:{1}", Thread.CurrentThread.ManagedThreadId, a);
// Thread.Sleep(1000);
// }
//});
//thread2.Name = "MyFun2";
//thread2.IsBackground = true;
////设置优先级,只是建议告诉CPU处理。
//thread2.Priority = ThreadPriority.Highest;
//thread2.Start(99);
#endregion #region 异步委托
//AddFunDel aDel = new AddFunDel(AddFun);
////通过异步调用这个委托
//IAsyncResult iresult = aDel.BeginInvoke(3, 5, null, null);
////...异步委托,在新建子线程中执行委托中方法,主线程被阻塞状态。
//int num = aDel.EndInvoke(iresult);
//Console.WriteLine("计算结果:{0} , 执行线程{1}", num, Thread.CurrentThread.ManagedThreadId);
#endregion #region 异步委托回调函数
AddFunDel aDel = new AddFunDel(AddFun);
//AsyncCallback
IAsyncResult iresult = aDel.BeginInvoke(, , new AsyncCallback(MyAsyncCallback), );
//主线程不会阻塞
while (!iresult.IsCompleted) //IsCompleted 检测异步操作是否已完成。
{
Console.WriteLine("主线程继续执行中...");
Thread.Sleep();
}
#endregion
Console.ReadKey();
} static void MyFun()
{
while (true)
{
Console.WriteLine("子线程{0},正在执行中。", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
}
} static void MyFun2(object a)
{
Console.WriteLine("子线程{0},正在执行中。参数值:{1}", Thread.CurrentThread.ManagedThreadId, a);
} static int AddFun(int a, int b)
{
Console.WriteLine("子线程{0},正在执行中,开始运算a+b", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
return a + b;
} //异步委托回调函数
static void MyAsyncCallback(IAsyncResult result)
{
AsyncResult aResult = (AsyncResult)result; //封装类 通过接口 实现多态
AddFunDel addDel = (AddFunDel)aResult.AsyncDelegate; //封装委托
int num = addDel.EndInvoke(result); //获取异步操作结果
Console.WriteLine("计算结果:{0} , 执行线程{1}", num, Thread.CurrentThread.ManagedThreadId);
int i = (int)aResult.AsyncState; //BeginInvoke方法中最后一个参数
Console.WriteLine("BeginInvoke最后一个参数调用:{0}", i);
}
}
}

C# Invoke 使用 异步委托的更多相关文章

  1. c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调

    单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都 ...

  2. C#固定时间执行指定事件(观察者模式+异步委托)

    最近有个项目需要每天固定的时间去执行指定的事件,发现网上关于这样的文章比较少,而且比较散.通过学习了几篇文章后终于实现了这个功能,在此也特别感谢这些文章的作者们,这也是我第一次在园子里面发文章,望多指 ...

  3. 异步委托 多线程实现摇奖器 winform版

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  4. 6.26学习 异步委托回调函数 VS 多线程 VS 并行处理

    描述: 我现在是轮询着构建实例,然后这个实例去执行一个方法,但是执行方法需要大约10s时间,全部轮询下来需要很长时间.所以我现在要更改,头给了我两个方法,1多线程 2异步委托回调函数. 异步委托回调函 ...

  5. .net异步委托

    委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大佬使用If-Else(Switch)语句,同时使得程序 ...

  6. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件

    通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二).   前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...

  7. .NET委托解析(异步委托)

    上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.NET 委托的内部实现,从浅入深的角度来详细的去解析委托的实质,本文将系上篇继续讨论异步委托的实现以及异步委托的源 ...

  8. Async异步委托

    /// <summary> /// 异步委托 /// </summary> public delegate void AsyncHandler(); public static ...

  9. 异步委托(APM)使用Func异步操作,处理耗时操作

    使用委托进行异步操作,处理一些耗时操作,防止主线程阻塞 使用例子: using System; using System.Collections.Generic; using System.Linq; ...

随机推荐

  1. Blackey win10 + python3.6 + VSCode + tensorflow-gpu + keras + cuda8 + cuDN6N环境配置(转载)

    win10 + python3.6 + VSCode + tensorflow-gpu + keras + cuda8 + cuDN6N环境配置   写在前面的话: 再弄这个之前,我对python也好 ...

  2. AOF 持久化策略

    Redis为了解决AOF后台重写造成的数据不一致问题,设置了AOF重写缓冲区.即使设置了no-appendfsync-on-rewrite yes也会造成短暂的主进程阻塞.原因就在于子进程完成AOF重 ...

  3. 【转】 Monkey测试1——Monkey的使用

    前言: 最近开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括android测试框架.CTS.Monkey.Monkeyrunner.benchmark.其 ...

  4. hadoop2.4完全分布式部署

    hadoop2.4完全分布式部署 感谢:http://blog.csdn.net/licongcong_0224/article/details/12972889 集群组成: 两台red hat en ...

  5. 第4步:创建RAC共享磁盘组

    方法一:使用asmdevices(推荐使用,但不适用EMC Powerpath) )查看硬盘的SCSI号,两个机器认到的/dev/sda对应在实际的物理盘可能不是一块,但scsi号肯定是完全一致的. ...

  6. CImg的使用,入门

    CImg的使用: const char *imageIN="image.jpg" const char *imageOUT="imgeout.jpg" CImg ...

  7. react 近期

    ECMAScript 6 入门:http://es6.ruanyifeng.com/#docs/destructuring#%E6%95%B0%E7%BB%84%E7%9A%84%E8%A7%A3%E ...

  8. php读取xml的神器

    <?xml version="1.0 encoding="UTF-8"?> <humans> <zhangying> <name ...

  9. [HTML5&amp;CSS3]Transform具体解释

    Transform字面上就是变形,改变的意思. 在CSS3中transform主要包含以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix.以下我们 ...

  10. 1076: [SCOI2008]奖励关

    1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2078  Solved: 1118[Submit][Statu ...