2017-08-03 1 views
-5
Thread t; 
    string mystring = ""; 
    private void button2_Click(object sender, EventArgs e) 
    { 

     t = new Thread(write); 
     t.Start(); 
     while (t.IsAlive) ; 
     textBox1.Text = mystring; 

    } 

    void write() 
    { 
     int i; 
     for (i=0; i<1000 ;i++) ; 
     mystring+= "mubeen" +i.ToString() + "\r\n"; 


    } 
+3

のためのセミコロン。 – DogeAmazed

+0

forループは設計どおりに動作しています。何もしないために1000回ループする –

+0

いいえ、その出力を表示しません:mubeen1000 ,,しかし このコードは、条件終了まで,,,, mubeen1、mubeen2、mubeen3などと出力を表示する必要があります.help me pls –

答えて

0

forループを書く方法が間違っています。必要な命令が複数ある場合は、コードを{セミコロンを行うと、削除するために、あなたは、このように

のための次に置く:

for (i=0; i<1000 ;i++) 
{ 
    mystring+= "mubeen" +i.ToString() + "\r\n"; 
} 

と私はちょうどあなたが同じ理由でこのようにそれを変更する必要がありますので、あなたがあなたの中で同じ間違いをした実現しました:

あなたはmubeen1000として出力を持っている0
+1

を削除しました。forループ内の1つのステートメントなので、角括弧は必要ありません。 – DogeAmazed

+0

@DogeAmazed私は知っているが、オペレーションがコードの別の行を追加したい場合は、それを実行するのがよい練習である –

+0

申し訳ありませんmここも新しいです。C#開始から..まだ同じproblmを持っています..このコードは、 、mubeen1、mubeen2、mubeen3などの条件が終わるまで。 –

-1
Thread t; 
string mystring = ""; 
private void button2_Click(object sender, EventArgs e) 
{ 

    t = new Thread(write); 
    t.Start(); 
    while (t.IsAlive) ; 
    textBox1.Text = mystring; 

} 

void write() 
{ 
    int i; 
    for (i=0; i<1000 ;i++) { 
     mystring+= "mubeen" +i.ToString() + "\r\n"; 
    } 


} 
+2

あなたが変更したものを書いて、彼の間違いを理解することができます –

+0

ちょうどしました。私は答えを用意している間に誤って提出されました。 – Manzurul

+0

あなたはこのようなブースを持つべきではありませんが、特にUIスレッドではありません。 – Servy

0

理由があるため、あなたのループ構文

int i; 
// since you don't specify the method to loop through, 
// this is basically looping through doing nothing other than incrementing i, resulted in i = 1000, in which therefore exiting the loop 
for (i=0; i<1000; i++); 

// this is the next statement which is execute, which is setting mystring to mubeen1000 
mystring+= "mubeen" +i.ToString() + "\r\n"; 

であるあなたは、次のようにforループを設定する必要があります。また

// since you expect it starts with mubeen1, start with i=1 and the condition i<=1000 (instead of i<1000) 
int i; 
for (i=1; i<=1000; i++) 
// specify what you want to do in the body of the loop 
{ 
    mystring+= "mubeen" + i.ToString() + "\r\n"; 
} 

、あなたのwhile文を問題があるように見える場合もあります。

while (t.IsAlive) 
{ 
    textBox1.Text = mystring; 
} 
+0

あなたはこれのようなブースーを持ってはいけませんが、特に* UIスレッドにはありません。 – Servy

1

問題は、forループの最後に誤ったセミコロン;が含まれていることです。これは、ループの本体が実際には必要な文字列連結ではなく、空文であることを意味します。

ループ変数は、ループの外部からアクセスできるのではなく、ループ自体で宣言することが望ましいです。私はあなたがを行ったと思う。これを最初にやるが、それは後の使用にアクセスできないときに移動した。ループ内でiが宣言されたときにiがそのコードで使用できなかったという事実は、そのコード行がループではないことを示す手がかりになっていたはずです。

次に、busyloopを一般的に(while (t.IsAlive) ;)持っているのは本当に悪い考えです。UIスレッドではそれ以上に悪いことがあり、作業中に何もしないようにUIスレッドをブロックします。 を非同期でにして、その間にUIスレッドを他のUI関連のタスクを処理したままにしておき、完了したらそれを更新する必要があります。また、スレッド間で共有されているフィールドが存在することを避けることが望ましいです。このフィールドは、このアクティビティとは無関係のコードにアクセスしてアクセス可能です。それはのように狭くできるだけスコープの状態を維持するのが最善です:

private async void button2_Click(object sender, EventArgs e) 
{ 
    string myString = await Task.Run(() => Write()); 
    textBox1.Text = myString; 
} 

private string Write() 
{ 
    StringBuilder output = new StringBuilder(); 
    for (int i = 0; i < 1000; i++) 
     output.AppendLine("mubeen" + i); 

    return output.ToString(); 
} 

注ループ内の文字列を連結することも非常によくスケールアップするつもりはないという。大きな文字列連結のために設計されたStringBuilderまたは別の同様のツールを使用する方が良いでしょう。