2017-05-17 1 views
0

현재 C#으로 개발 된 응용 프로그램을 작성 중입니다. 작업 관련 질문이 있습니다. Tasks 및 Asynchronous Programming 주제에 대한 연구를 수행했습니다. 그러나 작업을하는 동안 나는 여전히 자신감이 부족합니다.C# 프로그래밍에서 새 스레드를 시작하는 작업 사용

이 응용 프로그램에는 ReadOrWriteDBTable이라는 메서드가 있습니다. 이 메소드는 SQL 테이블에서 매초마다 읽기 또는 삽입 조작을 수행합니다. 기본적으로이 메서드는 매초마다 호출됩니다. 현재이 메소드는 응용 프로그램의 GUI 스레드와 동일한 스레드에서 실행 중입니다. 처음에는 테이블에 데이터가 거의 없기 때문에 문제가되지 않지만 테이블에서 데이터 양이 증가하면 GUI에 많은 문제가 발생할 수 있습니다. 따라서 GUI 스레드와 다른 스레드에서 이러한 데이터베이스 작업을 수행하고 싶습니다.

이것은 매 초 ReadOrWriteDBTable 메서드를 새 스레드를 통해 호출해야한다는 것을 의미합니다. 이것은 멀티 스레딩을 가져오고 스레드 풀을 관리하는 것이 어렵다고 생각합니다. 내가 TASKS에서 이해 한 것은 다중 스레딩의 모든 복잡한 작업이 TASK에 의해 완전히 처리된다는 것입니다. 그래서 다음과 같은 방법으로 Tasks를 사용한 여러 가지 스레딩 문제를 처리했습니다.

public int PollingTrigger 
{ 
    get 
    { 
     return this.pollingTrigger; 
    } 

    set 
    { 
     this.pollingTrigger = value; 

     Task.Factory.StartNew(ReadOrWriteDBTable); 
    } 

} 

Public void ReadOrWriteDBTable() 
{ 
    // Database select and update…. 
} 

은 PollingTrigger 속성은 호출 될 때마다 두 번째와 차례로 새로운 작업 방법 ReadOrWriteDBTable() 생성됩니다. 작업에서 결과를 반환 할 필요가 없으므로 작업에 Async 및 await 키워드를 사용하지 않으며 비동기 작업을 수행하지 않습니다. 내가 알고 싶습니다,이 작업의 사용은 정확하고 예외로부터 안전합니까? PollingTrigger 속성 (매초이 응용 프로그램에서)에 새 값이 설정 될 때마다 새 스레드를 시작하는 데 도움이됩니까?

이러한 자세한 설명은 죄송합니다. 나는 단지 내 질문을 분명히하고 싶었다. 나는 그것이 이 분명하기를 희망한다. 앞으로 귀하의 도움말이나 답변을 기대!

+2

아직 [this] (http://blog.stephencleary.com/2012/02/async-and-await.html) 문서를 보셨습니까? 도움이 될 수도 –

+1

Task.Factory.StartNew에 대한 안전한 속기 Task.Run()를 사용하고 여러 읽기의 incase, 나는 당신이 DB에서 플래그를 일종의 알고 있지만 아직 업데이 트되지 않았는지 확인해야한다고 생각 언제 다른 스레드가 – brykneval

답변

1

Task 경로가 필요하지 않습니다. 뛰어난 작업에 대해 await -ing (또는 .Wait) 리소스가 누출되지 않았는지 확실하지는 않습니다 (확실한 이유가 있지만 그 이유는 확실하지 않습니다). 그러나 하나만 사용하는 클래스를 Timer 클래스로 간단하게 사용할 수 있습니다. ThreadPool 스레드를 사용하여 원하는 간격으로 임의의 함수를 실행할 수 있습니다. 관리가 더 쉽습니다. .NET에서 제공하는 여러 가지 타이머가 있습니다. 차별화를위한 링크의 설명을 참조하십시오.

+0

에 오면 비 u 스레드를 단독으로 부여하지 않습니다. 그것은 자주 그런 식으로 작동하지만 모든 경우에 그런 것은 아닙니다. –

+0

@ IvanIčin, 예, 당신 말이 맞아요, 나는 그것에 대해서 생각조차하지 않았습니다. 작업이 적절한 해결책이 아니라고 느꼈으 며, 이제는 직감적으로 느꼈습니다. 감사! 그래서 +1로 답하십시오 :) – LB2

2

질문에 대한 답변을 정확하게 작성한다고해서 새 스레드가 있다는 보장은 없습니다. 스레드 풀의 모든 스레드에서 작업을 실행할 수 있지만 새 스레드로 보장 할 수는 없습니다.

그러나 이렇게하면 실제로 묻고 싶은 것을 이해할 수있는 UI 스레드에서 작업이 실행되지 않습니다. 비록 그것이 우아하지 않거나 가장 효율적일 수도 있지만 (정수가 필요한 이유는 확실치 않겠지 만), 프로젝트의 나머지 부분에 대한 통찰력이 없기 때문에 충분히 훌륭하거나 어쩌면 아주 좋을 수도 있습니다.

+0

@Ivan Ičin에게 답장을 보내 주셔서 감사합니다! 예, 내 목표는 UI와 동일한 스레드에서 실행하지 않는 것이 었습니다. 데이터베이스가 사용 중인지 여부를 확인하기 위해 플래그를 사용했기 때문에 새 스레드가 필요하지 않든 상관 없습니다. – Tom92

0

@ Ivan Ičin에 따르면 Task을 사용하면 새로운 스레드를 얻을 수 있다는 보증이 적용되지 않습니다.당신은 사용 가능한 스레드가없는 경우는 하나를 기다립니다, 스레드 풀에서 사용 가능한 스레드를 얻을 수 QueueUserWorkItem을 사용할 수 있습니다 : 당신은 당신이 사용해야하는 프로그램의 성능을 향상을 찾고 있다면,

QueueUserWorkItem(ReadOrWriteDBTable); 

을하지만 asyncawaitTask 또는 Thread 대신 (스레드)가 소켓과 같은 I/O 작업을 차단하고 리소스를 최적화 할 수 있기 때문입니다.

UPDATE (6월 12일) : MSDN과 주문에 따라 :

비동기은 잠재적으로 응용 프로그램이 웹에 액세스 할 때와 같이 차단 활동을 위해 필수적이다. 때때로 웹 리소스에 대한 액세스가 느리거나 지연됩니다.

이 정보는이 링크에서 읽혀질 수 : https://msdn.microsoft.com/es-mx/library/hh191443(v=vs.110).aspx

을 그리고, 귀하의 경우와 asyncawait, UI와 비동기를 사용하는 방법에 대한이 문서 회담의 계속 얘기 :

을 비동기 메서드를 사용하면 응용 프로그램이 UI에 계속 응답합니다. 예를 들어 창 크기를 조정하거나 최소화 할 수 있으며, 응용 프로그램이 닫히기를 기다리지 않으려는 경우 닫을 수 있습니다. 당신이 원하는대로

그래서, 사용하는 비동기 방법은 당신이 행해져 Yout UI를 찾고 있습니다하지만 당신이 async 방법으로 await 연산자를 사용하는 경우, 그것은 async 때까지 스레드를 기다리게됩니다 behaivor을 구현하는 데 도움이 메소드가 종료되었습니다.

+0

@ Jorge Omar Medra 고맙습니다! 하지만 나는 await과 asyn을 사용하여 작업이 완료 될 때까지 기다린 다음 동기식 작업과 같은 다른 코드 행을 계속 실행합니다. 하지만 작업과 GUI 스레드 모두가 병렬로 작동하기를 원합니다. – Tom92

+0

@ Tom92, 나는 대답했다. 나는'async' 메소드가 도움이 될 것이라고 생각하고있다. –

관련 문제