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

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

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

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

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

而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. SQL SERVER Update from 使用陷阱

    原文:SQL SERVER Update from 使用陷阱 update A set from A left join B on 此方法常用来使用根据一个表更新另一个表的数据,来进行数据同步更新.若 ...

  2. 提高MSSQL数据库性能(1)对比count(*) 和 替代count(*)

    原文:提高MSSQL数据库性能(1)对比count(*) 和 替代count(*) 文章准备的数据库: Atricles 表   数据量60690000条数据 ArticleID 主键自增列+自动建立 ...

  3. vue的表单的简单介绍 input radio checkbox等表单特性

    在vue中我们可以通过v-model来为表单元素实现双向绑定 1:v-model指令 数据的双向绑定 双向绑定是说我们不仅仅可以通过数据(M)的改变去影响视图(V),还是当视图的内容改变(V)去影响模 ...

  4. 解决no declaration can be found for element 'context:component-scan'

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  5. 【原创】关于bug反正出现的问题可能

    bug修正的问题:1. xib问题.2. 模块不清同时修改.3. svn代码合并的修改熟悉程度.4. 禁止全局格式化代码.

  6. 【Javascript 基础】对象

    1 创建对象 Javascript 支持对象的概率.有多种方法可以用来创建对象. <!DOCTYPE html> <html lang="en"> < ...

  7. Mismatched locale IDs. The component locale ID (2052) does not match the connection manager locale ID (2057)

    Snapshot: When using the 'Flat File Source' and 'OLE DB Destination' or something else components to ...

  8. 【读书笔记】【深入理解ES6】#1-块级作用域绑定

    var声明及变量提升(Hoisting)机制 在函数作用域或全局作用域中通过var关键字声明的变量,无论实际上是在哪里声明的,都会被当成在当前作用域顶部声明的变量.这就是我们常说的提升(Hoistin ...

  9. 王立平--scard0与scard1分别指的是什么?以及路径获取

    一般是: scard0:指系统内部存储 scard1:指外插的sd卡 也有特例.. 分别获取路径的方法: package com.main; import java.lang.reflect.Meth ...

  10. Git提交时提示‘The file will have its original line endings in your working directory’

    Git提交时提示'The file will have its original line endings in your working directory' Git出现错误 git add -A ...