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這樣使用嗎?不受外部變數變化而被影響
uj5u.com熱心網友回復:
Task.Run(() =>{
int b = a;
Console.WriteLine(b);//呼叫外部值
Thread.Sleep(2000);
Console.WriteLine(b);//休眠后再次呼叫
});
這種值物件,你另外復制一個值不就得了
或者Task.Run(() => Call(a));
uj5u.com熱心網友回復:
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);
}
uj5u.com熱心網友回復:
你的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();
}
uj5u.com熱心網友回復:
是這樣的!使用方法的確沒有污染到資料,請問這個具體的原因是啥!為什么直接寫就不可以uj5u.com熱心網友回復:
閉包是一種優秀的現代編程語言特性,在你這變成 污染資料 了uj5u.com熱心網友回復:
區別就是一個是傳遞的引數,一個是直接使用的一個東西吧uj5u.com熱心網友回復:
初入編程門,大神諒解一下
uj5u.com熱心網友回復:
Task.Factory.StartNew(p => { }, 1);
uj5u.com熱心網友回復:
基本上這又成了本版的月經問題了,好好理解物件的作用域,同時好好理解gc。
一個作用域,一個gc。幾乎每個星期都有人在折騰
uj5u.com熱心網友回復:
參見:https://technet.microsoft.com/zh-cn/windowsserver/dd321456(v=vs.90) state轉載請註明出處,本文鏈接:https://www.uj5u.com/net/141549.html
標籤:C#
下一篇:高效功能強大的net代碼生成器
