当我å°è¯•åœ¨if()中使用å˜é‡æ—¶ï¼Œå®ƒè¡¨ç¤ºæˆ‘使用的是未分é…çš„å˜é‡

时间:2014-04-24 06:18:24

标签: c# multithreading

string x1;                  
Dispatcher.Invoke(new Action (() => x1 = lbl1.Content.ToString()));

(我这样åšæ˜¯å› ä¸ºæˆ‘使用线程) (然åŽå½“我å°è¯•åœ¨if中使用它时)

if(x1 == "X"){}

(我收到错误,说我使用的是未分é…çš„å˜é‡ï¼‰

有人å¯ä»¥å‘Šè¯‰æˆ‘为什么会这样å—?

6 个答案:

答案 0 :(得分:2)

请å‚阅:

  string x1; // <- Just declared, not assigned

  // x1 is assigned, but in the different thread
  Dispatcher.Invoke(new Action (() => x1 = lbl1.Content.ToString()));

  // it may occure, that the diffrent thread hasn't finished yet, and 
  // x1 is still unassigned; that's why the compiler shows the warning
  if(x1 == "X"){}

但是,在æŸäº›æƒ…况下,编译器ä¸èƒ½è·Ÿè¸ªåˆ†é…,例如

  String x1;

  Action f = 
    () => { x1 = "X"; };

  f(); // <- x1 will be assigned here

  // Compiler erroneously warns here that x1 is unassigned,
  // but x1 is assigned  
  if (x1 == "X") 

答案 1 :(得分:1)

æ¥è‡ªCompiler Error CS0165

  

C#编译器ä¸å…许使用未åˆå§‹åŒ–çš„å˜é‡ã€‚如果   编译器检测到å¯èƒ½æ²¡æœ‰çš„å˜é‡çš„使用   åˆå§‹åŒ–,它会生æˆç¼–译器错误

您声明了x1å˜é‡ï¼Œä½†æœªå¯¹å…¶è¿›è¡Œåˆå§‹åŒ–。å¯èƒ½éœ€è¦åˆå§‹åŒ–它,如;

string x1 = "";

或

string x1 = null;

答案 2 :(得分:1)

当你åƒè¿™æ ·åˆ†é…x1æ—¶

string x1;                  
Dispatcher.Invoke(new Action (() => x1 = lbl1.Content.ToString()));

您在ä¸åŒçš„线程上分é…x1,但编译器无法检测到您的å˜é‡å·²åˆ†é…。

å°è¯•è®¾ç½®x1的默认值,以解决问题

String x1 = "";

希望有所帮助

答案 3 :(得分:0)

编译器没有æ„识到您正在分é…x1,因为这ä¸æ˜¯ä¸€ä¸ªç®€å•çš„分é…。 因此,åªéœ€æ›´æ”¹æ­¤è¡Œï¼š

string x1 = null; // or assign a different default value

答案 4 :(得分:0)

由于您在å¦ä¸€ä¸ªçº¿ç¨‹ä¸­æŒ‡å®šx1,因此主线程x1中的原因未分é…

您å¯ä»¥åœ¨å£°æ˜Žnull

时将x1分é…ç»™x1æ¥æ›´æ­£æ­¤é—®é¢˜
string x=null;

答案 5 :(得分:0)

想一想,你正在使用多线程。

  1. 在主题A上,您声明x1。
  2. 在线程A上,您å°è¯•ä½¿ç”¨x1。
  3. 在主题B上指定x1。
  4. 现在,活动的顺åºæ˜¯ä»€ä¹ˆï¼Ÿä¼š1 > 3> 2å—?为什么编译器应该å‡è®¾ï¼Ÿ
    如果它是1 >2 >3,则æ„味ç€æ‚¨åœ¨åˆ†é…之å‰å°è¯•ä½¿ç”¨x1,这就是编译器所抱怨的。