请教Task如何传入参数?或者有什么改进方式

qq_40118399 2019-07-03 03:37:37
int a = 1;
Task.Run(() =>
{
Console.WriteLine(a);//调用外部值
Thread.Sleep(2000);
Console.WriteLine(a);//休眠后再次调用
});

Thread.Sleep(1000);
a = 12;//休眠后修改值
Console.ReadKey();
如上代码,在外部参数修改后,Task线程还在运行时,会受到影响。分别输出两种结果。

object a = "a";
ParameterizedThreadStart pts = new ParameterizedThreadStart((fileName) =>
{
Console.WriteLine(fileName);
Thread.Sleep(2000);
Console.WriteLine(fileName);
});
Thread OpenFileTheard = new Thread(pts);
OpenFileTheard.Start(a);
Thread.Sleep(1000);
a = "b";
而使用Thread这种方式传入参数,线程不受影响。输出结果并未受影响
请问Task有什么方式可以像Thread这样使用吗?不受外部变量变化而被影响
...全文
1672 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2019-07-03
  • 打赏
  • 举报
回复
引用 4 楼 qq_40118399 的回复:
[quote=引用 2 楼 hanghangz 的回复:]
  object aa="c";
            Task.Run(() => ActionX(aa));

            Thread.Sleep(1000);
            aa = 12;//
            Console.ReadKey();
  private static void ActionX(object fileName)
        {
            Console.WriteLine(fileName);
            Thread.Sleep(2000);
            Console.WriteLine(fileName);
        }
是这样的!使用方法的确没有污染到数据,请问这个具体的原因是啥!为什么直接写就不可以[/quote] 基本上这又成了本版的月经问题了,好好理解对象的作用域,同时好好理解gc。 一个作用域,一个gc。几乎每个星期都有人在折腾
wanghui0380 2019-07-03
  • 打赏
  • 举报
回复
Task.Factory.StartNew( p => { }, 1);
qq_40118399 2019-07-03
  • 打赏
  • 举报
回复
引用 5 楼 stherix 的回复:
闭包是一种优秀的现代编程语言特性,在你这变成 污染数据 了
初入编程门,大神谅解一下
hanghangz 2019-07-03
  • 打赏
  • 举报
回复
区别就是一个是传递的参数,一个是直接使用的一个东西吧
stherix 2019-07-03
  • 打赏
  • 举报
回复
闭包是一种优秀的现代编程语言特性,在你这变成 污染数据 了
qq_40118399 2019-07-03
  • 打赏
  • 举报
回复
引用 2 楼 hanghangz 的回复:
  object aa="c";
            Task.Run(() => ActionX(aa));

            Thread.Sleep(1000);
            aa = 12;//
            Console.ReadKey();
  private static void ActionX(object fileName)
        {
            Console.WriteLine(fileName);
            Thread.Sleep(2000);
            Console.WriteLine(fileName);
        }
是这样的!使用方法的确没有污染到数据,请问这个具体的原因是啥!为什么直接写就不可以
正怒月神 2019-07-03
  • 打赏
  • 举报
回复
你的task是调用了外部变量。 你的thread是使用的入参。肯定不一样。值类型传递参数是个副本。
static void Main(string[] args)
        {
            int a = 10;
            Task.Factory.StartNew(x => {
                x = (int)x+10;
                Console.WriteLine(x);
            },a);
            Thread.Sleep(1000);
            Console.WriteLine(a);
            Console.ReadKey();
        }
hanghangz 2019-07-03
  • 打赏
  • 举报
回复
  object aa="c";
            Task.Run(() => ActionX(aa));

            Thread.Sleep(1000);
            aa = 12;//
            Console.ReadKey();
  private static void ActionX(object fileName)
        {
            Console.WriteLine(fileName);
            Thread.Sleep(2000);
            Console.WriteLine(fileName);
        }
stherix 2019-07-03
  • 打赏
  • 举报
回复
Task.Run(() => { int b = a; Console.WriteLine(b);//调用外部值 Thread.Sleep(2000); Console.WriteLine(b);//休眠后再次调用 }); 这种值对象,你另外复制一个值不就得了 或者Task.Run(() => Call(a));

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧