2016-12-12 13 views
0

私が作成したいタブコントロールといくつかのコントロールを持つアプリケーションを作成しています。だから私は基本的にコントロールとテキストボックスを作る関数を持っています。コードは次のようになります:テキストボックスの入力によってWinformsのUIがハングするC#

TextBox message_box = new TextBox(); 
message_box.Size = new Size(790, 38); 
message_box.Location = new Point(9, 7); 
message_box.Font = new Font("Microsoft Sans Serif", 20); 
message_box.KeyDown += Message_box_KeyDown; 
message_box.Enter += Message_box_Enter; 
bottom_panel.Controls.Add(message_box); 

私はまた、いくつかの他のコントロールを追加しましたが、この特定のコントロールが問題を抱えています。なぜなら、これらのコントロールをタブページに追加すると、tabcontrolにタブページを追加して、何か変わったことが起こるからです。

追加されたtabPage内のすべてのコントロールは、うまく機能しており、遅延もありません。しかし、私がテキストボックスに入力すると、私は大規模なラグを取得し、それはフリーズします。これは、tabControlのデザイナ作成ページにもテキストボックスを追加した場合にも発生します。

これがトリガされているイベントです。

private async void Message_box_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData == Keys.Enter) 
    { 
     string name = ""; 
     this.Invoke(new MethodInvoker(delegate { name = tabControl1.SelectedTab.Name; })); 
     TextBox box = new TextBox(); 
     this.Invoke(new MethodInvoker(delegate { box = (TextBox)sender; })); 
     if (box.Text.Length > 0) 
     { 
      uiControls.ListItem melding = await Task.Factory.StartNew(() => sendMelding(name, box.Text)); 
      box.Clear(); 
     } 
    } 
} 

私は私が間違っているのかわからない、と遅れ停止するようにテキストボックスを作成する方法。私はinvokationが必要かどうかをチェックしようとしました、私はinvokationをtryedしています。私もフォームでCreateParamsををowerwriting、このコードを使用している:私が書く

protected override CreateParams CreateParams 
{ 
    get 
    { 
     // add the drop shadow flag for automatically drawing 
     // a drop shadow around the form 
     CreateParams cp = base.CreateParams; 
     cp.ExStyle |= 0x02000000; 
     cp.ClassStyle |= CS_DROPSHADOW; 
     return cp; 
    } 
} 

を明確にする、のKeyDown機能がパフォーマンスにヒットを持っていない、KeyDownイベントの関数内のコードが発射されていないたび、そののみ私がエンターを押したときに解雇された。しかし、通常、テキストボックスに約2〜3文字を書き込むと、遅れが現れ始め、プログラムがフリーズします。

+0

'sendMelding'の機能は何ですか?あなたのテキストボックスにデータがあるたびに 'sendMelding'メソッドを呼び出す必要がありますか? –

+0

Enterキーを押すか、すべてのキーを押すと入力が遅れますか? – krillgar

+0

**あなたが** KeyDownイベントを起動していなくても遅れはありますか? – Vikhram

答えて

1

私は、あなたがタスクが完了するのを待っているので、あなたが続行する前に待っていると思われます。それはあなたが持っている、次のとおりです。

if (box.Text.Length > 0) 
{ 
    uiControls.ListItem melding = await Task.Factory.StartNew(() => sendMelding(name, box.Text)); 
    box.Clear(); 
} 

タスクが完了するまでbox.Clearへの呼び出しが実行されません。

あなたがここで達成しようとしていることがわからないので、これを修正する方法を言うのは難しいです。

また、その方法でInvokeの使用を確認する必要があります。あなたにはいくつかの誤りがあります。たとえば、Invokingなしでbox.Text.Lengthにアクセスします。つまり、UIハンドラ以外のスレッドでイベントハンドラが呼び出された場合、例外が発生します。

+0

KeyDownイベントのコードは、私がenterキーを押したときにのみ発生します。しかし、遅れや凍結は、イベントの有無に関係なく発生します。 – blueio22

+0

スレッド間の呼び出しが原因で発生している例外も認識しています。しかし、テキストボックスの遅延とフリーズは、イベントとそのアルゴリズムに関係なく発生します。 – blueio22

+0

Enterを押したときに実行されるすべてのコードをコメントアウトすると、遅延はまだ存在しますか?もしそうなら、おそらく 'KeyDown'イベントが原因ではなく、あなたは別の場所で問題を探しているはずです。 –

関連する問題