2016-12-12 5 views
0

나는 내가 원하는 tabControl 및 일부 컨트롤이있는 응용 프로그램을 만들고 있습니다. 그래서 기본적으로 컨트롤과 텍스트 상자를 만드는 함수가 있습니다. 코드는 다음과 같습니다 :텍스트 상자 타이핑 UI Winforms 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에 tab page를 추가하기 때문에 이상한 일이 발생하기 때문입니다.

추가 된 tabPage의 모든 단일 컨트롤이 지연없이 작동합니다. 하지만 textBox를 입력하면 막대한 지연이 발생하고 정지합니다. 이 또한 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이 필요한지 확인하기 위해 tryed했다. 나는 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' 이벤트가 범인이 아니며 문제의 다른 곳을 찾아야합니다. –