logfile.txt에서 일부 항목을 대체하거나 제거해야하는 프로그램을 작성 중입니다. 코드가 정상적으로 작동하고 있습니다 (최소한 작은 LogFiles의 경우). 큰 파일 (예 : 27MB)을 사용하면 매우 느려지고 UI가 정지됩니다. 나는 아무것도 클릭 할 수 없다.UI Freezing and Computation 정말 느림
버튼에 나는이 방법을 실행하십시오
private string delete_Lines(string[] lines, string searchString)
{
for (int i = 0; i < lines.Length; i++)
{
if (lines[i].Contains(searchString))
{
rtbLog.Text += "Deleting(row " + (i + 1) + "):\n" + lines[i] + "\n";
progressBar1.Value += 1;
if (cbDB == true)
{
while (is_next_line_block(lines, i) == true)
{
i++;
rtbLog.Text += lines[i] + "\n";
progressBar1.Value += 1;
}
}
}
else
{
res += lines[i]+"\n";
progressBar1.Value += 1;
}
}
tssLbl.Text = "Done!";
rtbLog.Text += "...Deleting finished\n";
return res;
}
라인은 내가 청소하려고 로그 파일의 배열입니다. 모든 항목은 단일 행입니다. tssLbl은 알림 레이블이고 rtbLog는 richTextBox입니다. 여기서 i는 삭제할 행을 추적합니다.
is_next_line_block은 또 다른 방법으로, 다음 줄을 검사하는 것은 삭제하려는 블록의 일부입니다. 이 메소드의 매개 변수는 전체 행 배열과 행 위치입니다.
private bool is_next_line_block(string[] lines, int curIndex)
{
if (curIndex < lines.Length-1)
{
if (lines[curIndex + 1].StartsWith(" "))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
아무 생각없는 사람, 그게 얼어 붙어서 프로그램 속도가 느려 집니까? 필자는 병렬화를 통해 코드를 빠르게 할 수는 있지만 병렬 처리가 필요없는 27 MB txt 파일을 확인하는 데 오랜 시간이 걸린다는 것을 알고 있습니다.
'BackgroundWorker' _does_ 사용 스레드를, 그리고 특별히 진행 업데이트를 할 수 있도록 설계 UI에. 문제를 파악하는 데 어려움이있는 경우 구체적으로 질문하십시오. 성능에 관해서는 다른 스레딩 모델을 사용하여 성능을 변경하지는 않습니다. 27MB를 처리하는 데 시간이 오래 걸리면 해당 파일이 가장 느린 디스크에 저장되거나 처리 속도가 너무 느립니다. 어떤 경우이든이 예제를 좀 더 단순하게 좁히고 한 번에 한 이슈에만 집중해야합니다. http://stackoverflow.com/help/mcve 및 http://stackoverflow.com/help/how-to-ask –
을 참조하십시오. 코드를 별도의 클래스로 옮기고 해당 클래스를 호출하면 적절한 매개 변수가 필요합니다. 지금 어떻게하고 있는지. 이제이 클래스를 인스턴스화하고'Task.Factory.시작()'을 클릭하고 앱이 여전히 느려지는지 여부를 알려주십시오. 시각적 큐 (예 : 진행률 막대 등)를 설정/해제해야하는 경우 '.ContinueWith'를 추가해야합니다. – code4life
@PeterDuniho 내 질문과 코드 블록을 편집하므로 더 잘 읽을 수 있습니다. 제안을위한 ty. at code4life : 내가 정확히 당신을 이해하고 있음을 확인하십시오. 당신은 저의 전체 코드 (ui의 부분을 기대하십시오)를 새로운 클래스로 옮기고 거기에서 계산을하기를 원하십니까? 솔직히 말해서 Task.Factory.Start()에서 무엇을 의미하는지 알지 못합니다. 정확히 무엇을합니다. 계속 하시겠습니까? – Depa