先说同步与异步的区别,总说同步异步的,其实一直不清楚什么是同步异步,今天找了一下:

同步:当一个消息发送后,等对方回应后继续发送下一条指令。

异步:当一个消息发送后,不等对方回应就发送下一条。

同步,举个例子,就是你给人打电话的时候,你说一句,对方回你一句,然后你在说下一句,交流嘛。

异步呢,你给一个人打电话,你一直在说。

而BeginInvoke与Invoke就是同步与异步。BeginInvoke是异步操作,Invoke是同步操作。而这两个方法中执行的是一个委托。

举一个代码中的例子,在WPF中有一个TextBlock控件,Name属性为txtContent有时候会出现跨线程的问题,这个什么时候出现,我现在不知道为啥模拟不出来了。但是我记得这样的写法,因为我感觉这样的写法就是为了防止出现这种问题的。是这样写的:

 
1
2
3
4
txtContent.Dispatcher.Invoke(new Action(() =>
{
    txtContent.Text = "xxxxxxx";
}));

如果带有参数的话就这么写:

 
1
2
3
4
txtContent.Dispatcher.Invoke(new Action<stringstring>((arg1, arg2) =>
{
    txtContent.Text = arg1 + arg2;
}), "参数1""参数2");

如果多个参数的话,Action泛型中增加就可以了。后面也相对的增加传递的值。

使用Dispatcher.Invoke就是所谓的同步更新,异步更新呢?就是吧Invoke换为BeginInvoke就是异步了,其实看了一些资料我还是没明白Invoke和BeginInvoke到底有什么区别。但是呢,更新界面的话,必须是UI线程,也就是谁创建了UI控件就由谁来更新,跨线程更新是肯定会报错的。所以,也就有了BeginInvoke和Invoke的方法了,使用这种方法调用的也就不报错了,因为这两个还是运行在UI线程上的。

 
1
2
3
4
5
6
7
8
9
10
11
txtContent.Dispatcher.BeginInvoke(new Action<stringstring>((arg1, arg2) =>
{
    //此处写需要进行异步的操作
    txtContent.Text = arg1 + arg2;
}), "参数1""参数2");
//或这样写
Dispatcher.BeginInvoke(new Action<TextBlock>((arg_txt) =>
{
    //此处写需要进行异步的操作
    arg_txt.Text = "异步更新";
}), txtContent);

找这个理解的话,写在BeginInvoke中的委托更新要比Invoke好,因为Invoke是同步更新,要等任务结束后才会更新界面,BeginInvoke的话就不管了,异步嘛,不等,直接更新了。

昨天没写完,继续说。

但是上面的委托体内如果有耗时操作,还是会出现UI界面假死的状况,例如如下的代码:

 
1
2
3
4
5
6
txtContent.Dispatcher.BeginInvoke(new Action<stringstring>((arg1, arg2) =>
{
    //此处写需要进行异步的操作
    for (long i = 0; i < 2147483647; i++)
        txtContent.Text = arg1 + arg2 + i;
}), "参数1""参数2");

如何才能更好的解决这种假死的情况呢?因为BeginInvoke和Invoke只是为了解决线程安全的问题,要解决假死的问题很多时候用到的都是BackgroupWorker。不多说了,但是我在网上查找资料的时候又找到了另外一种写法:

 
1
2
3
4
5
6
7
8
9
10
Action ut = new Action(() =>
{
    //耗时操作
    for (long i = 0; i < 2147483647; i++)
        txtContent.Dispatcher.Invoke(new Action(() => { txtContent.Text = "" + i; }));
});
IAsyncResult result = ut.BeginInvoke(new AsyncCallback(new Action<IAsyncResult>((asyncResult) =>
{
    if (asyncResult == nullreturn;
})), ut);

这种写法与BackgroupWorker有什么区别呢,不清楚,毕竟我不是高手,在这条路上探索的一个程序员而已。只是我觉得,不用写那么多行了。

同步与异步区别,Invoke与BeginInoke的区别的更多相关文章

  1. IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别参考

    参考https://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral IO复用,AI ...

  2. IO多路复用,同步,异步,阻塞和非阻塞 区别

    一.什么是socket?什么是I/O操作? 我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切都是 ...

  3. IO多路复用,同步,异步,阻塞和非阻塞 区别(转)

    转自:http://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral 同步.异步 是 ...

  4. IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别(百度)

    如果面试问到IO操作,这篇文章提到的问题,基本是必问,百度的面试官问我三个问题 (1)什么是NIO(Non-blocked IO),AIO,BIO (2) java IO 与 NIO(New IO)的 ...

  5. (转)IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别

    本文来自:https://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral,非常感谢 ...

  6. IO模型同步与异步阻塞与非阻塞的区别

    同步异步的区别 关注点:同步和异步关注的是消息通信机制 同步:所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由*调用者*主 ...

  7. IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别

    一.什么是socket?什么是I/O操作? 我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切都是 ...

  8. AIO,BIO,NIO,IO复用,同步,异步,阻塞和非阻塞

    (1)什么是NIO(Non-blocked IO),AIO,BIO (2) 区别 (3)select 与 epoll,poll区别 1.什么是socket?什么是I/O操作? 什么是socket? 实 ...

  9. IO中同步、异步与阻塞、非阻塞的区别

    一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...

随机推荐

  1. 搭建基于asp.net的wcf服务,ios客户端调用的实现记录

    一.写wcf 问题: 1.特定的格式 2.数据绑定 3.加密解密 二.发布到iis 问题: 1.访问权限问题,添加everyone权限 访问网站时:http://localhost/WebbUploa ...

  2. linux命令行翻页

    在linux上面执行命令,若命令太多屏幕显示不完,通过Shift+pageup/pageDown来查看. putty连接linux后执行就不存在这个问题.

  3. hdu1008(c++)

    分清上升停留下降一步步来就是了 #include<iostream>#include<vector>using namespace std;int main(){ int N, ...

  4. linux 远程同步数据工具rsync (2)

    在远程主机上建立一个rsync的服务器,在服务器上配置好rsync的各种应用,然后本机作为rsync的一个客 户端去连接远程的rsync服务器.如何去配置一台rsync服务器. 首先配置/etc/rs ...

  5. 彻底解决DZ大附件上传问题

    个. 注意:很多人遇到修改php.ini后重应WEB服务后仍然不能生效.这种情况应该先确认一下所改的php.ini是不是当前PHP所使用的.您可以在WEB目录下建立一个php文件,内容很简单就一句话& ...

  6. JStorm文档

    Jstorm的性能测试 JStorm 大概是Apache Storm 4倍, Apache Flink 1.5 倍, Twitter Heron 2 ~ 10 倍 Jstorm是一个分布式实时计算引擎 ...

  7. XQuery获取节点的属性名与值

    e.g: DECLARE @xmlSource XML SET @xmlSource = '<t topA="1"> <a x="2" z=& ...

  8. object-c 框架之经常使用结构体

    Foundation 框架定义经常使用结构体.结构体採用object-c 定义:经常使用NSSRange,NSPoint.NSSize,NSRect等 一.NSRange 创建范围结构体. 方法:NS ...

  9. STL学习笔记(第四章 通用工具)

    本章讲解C++标准程序库中的通用工具.它们是由短小精干的类和函数构成. Pairs(对组) class pair可以将两个值视为一个单元.STL内多处使用了pair.尤其容器map和multimap, ...

  10. JavaWeb Session详解

    代码地址如下:http://www.demodashi.com/demo/12756.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + ## Session的由来 上一篇博文介绍 ...