• .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);
        });
    }
  • 相关阅读:
    Osg-地图界面显示指北针(指南针)
    学习c# 7.0-7.3的ref、fixed特性并在Unity下测试
    Linux下使用FreeBSD的ee
    C++ 中 malloc/free与 new/delete区别
    CMake 手册详解
    go 从入门到了解
    LINQ:对结果进行分组(MSDN)
    LINQ: List Contains List
    C# 如何使用log4net
    控制台程序要最后加上一句 Environment.Exit(0);
  • 原文地址:https://www.cnblogs.com/guogangj/p/5455500.html
Copyright © 2020-2023  润新知