.net的简易多线程处理

这篇文章是对几年前写的<Task及其异常处理的若干事项>的一些狗尾续貂的补充。

更简单的写法

几年前写的那篇文章很详细地描述了.net用Task对线程进行封装的相关技术。开一个新的线程去执行一个任务,当时是这么写的:

Task taskA = Task.Factory.StartNew(() =>{
    //Do something...
});

现在还有一种更简单的写法:

Task.Run(() => {
    //Do something...
});

延迟执行

另外还有“延迟执行”,啥叫延迟执行?就是:多少时间后,给我执行这个动作!

Task.Delay(mSec).ContinueWith(_ => {
    //Do something...
});

 延迟执行后在UI线程中执行某个操作(通常是更新界面)。

Task.Delay(mSec).ContinueWith(_ => {
    //Do UI update operation
}, TaskScheduler.FromCurrentSynchronizationContext());

UI更新

这样开线程执行任务的话是不能操作UI上的元素,那如何操作UI上的元素?(以WPF为例)

Dispatcher.BeginInvoke((Action)(() => {
    //Do UI operation here...
}));

闭包(Closure)

另外还可以实现“闭包”,即Task这段代码访问它外部的变量:

int value = 10;
Task.Run(() => {
    Debug.WriteLine("value is " + value);
});

说到闭包,要记住这里有个坑:

for (int i = 0; i < 10; i++) {
    Task.Run(() => {
        Debug.WriteLine("i value is " + i);
    });
}

输出全是10,想输出1-9,有两种办法,1是赋值一个局部变量:

for (int i = 0; i < 10; i++) {
    int j=i;
    Task.Run(() => {
        Debug.WriteLine("i value is " + j);
    });
}

另一种方法是用foreach:

int[] arr = {0,1,2,3,4,5,6,7,8,9};
foreach (int i in arr) {
    Task.Run(() => {
        Debug.WriteLine("i value is " + i);
    });
}

转载于:https://www.cnblogs.com/guogangj/p/5455500.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值