2010-11-20 6 views
2

다음과 같은 클래스의 골격을 가지고 있습니다. TODO : comment에서 볼 수 있듯이 여기서 AsyncEnumerator 구조를 구현할 것입니다. 이 메소드는 요청을 가져 와서 데이터를 다른 메소드로 전달하여 처리합니다. 프로세스를 기반으로 SendMilestoneReached 또는 SendFailed 이벤트를 호출하고 싶습니다. AsyncEnumerator로 인해 이러한 스레드가 다른 스레드에서 발생할 수 있습니다.비동기 적으로 발생하면 이벤트가 작동합니까?

Webtext 클래스가 호출 될 UI 스레드에 영향을 줍니까?

/// <summary> 
/// Sends Webtexts. 
/// </summary> 
public class Webtext 
{ 
    #region Event Definitions 

    // Events. 
    public event EventHandler<SendingEventArgs> SendStarted = delegate { }; 
    public event EventHandler<SendingEventArgs> SendFailed = delegate { }; 
    public event EventHandler<SendingEventArgs> SendSuccessful = delegate { }; 
    public event EventHandler<SendingEventArgs> SendMilestoneReached = delegate { }; 

    // Shared EventArgs Object, Consumed by the Events. 
    SendingEventArgs EventArgs = new SendingEventArgs(); 

    #endregion 

    /// <summary> 
    /// Executes the send request. 
    /// </summary> 
    /// <param name="Operator">The operator whos service to use.</param> 
    /// <param name="Username">The username of the requested operator.</param> 
    /// <param name="Password">The password of the requested operator.</param> 
    /// <param name="Content">The content to send.</param> 
    /// <param name="Recipient">The recipient to recieve the content.</param> 
    public void ExecuteSendRequest(string Operator, 
            string Username, 
            string Password, 
            string Content, 
            string Recipient) 
    { 
     //TODO: Implement Async requests here. 
    } 

    #region Event Handlers 

    /// <summary> 
    /// Called when [sending started]. 
    /// </summary> 
    protected void OnSendingStarted() 
    { 
     SendStarted(this, EventArgs); 
    } 

    /// <summary> 
    /// Called when [send fail]. 
    /// </summary> 
    protected void OnSendFail() 
    { 
     SendFailed(this, EventArgs); 
    } 

    /// <summary> 
    /// Called when [send successful]. 
    /// </summary> 
    protected void OnSendSuccessful() 
    { 

     SendSuccessful(this, EventArgs); 
    } 

    /// <summary> 
    /// Called when [send milestone reached]. 
    /// </summary> 
    protected void OnSendMilestoneReached() 
    { 
     SendMilestoneReached(this, EventArgs); 
    } 

    #endregion 


} 

답변

3

이벤트는 그것을 올렸다 같은 Thread에 의해 생성된다. 이 원리는 단순하지만 중요한 사실로 알고 있습니다. 그래서

:

시나리오 1 앱 열립니다. Webtext은 UI 스레드의 양식에 의해 초기화되고 send가 호출됩니다. Webtext동기식으로 요청을 보내고 이벤트를 발생시킵니다. 전체 시간 동안 모든 작업은 UI 스레드에서 수행됩니다.

시나리오 2 응용 프로그램이 열립니다. Webtext은 UI 스레드의 양식에 의해 초기화되고 send가 호출됩니다. Webtext은 작업자 스레드를 사용하여 비동기 적으로 요청을 보냅니다. 두 번째 스레드가 완료되면 이벤트를 시작합니다. 이것은 작업자 스레드 (스레드 작성 방법에 따라 배경 또는 전경색)가됩니다. 이 스레드를 통해 UI 요소에 대한 호출은 Invoke을 사용하여 완료해야합니다.

보시다시피, 은 전송 방법을 구현하는 방법에 따라 매우 다릅니다. 내가 보낼 수있는 구현 자체를 볼 수 없기 때문에 스레드를 생성하거나 스레드 풀을 사용하는 경우에는 작업 스레드에서 UI 스레드에 동 기적으로 보내는 것이 좋습니다.

+0

구현이 포함되어 있지는 않지만 두 번째 시나리오는 적용 가능하다고 생각합니다. 본질적으로 나는 웹 요청 객체를 사용하여 비동기 적으로 호출 할 것이다. 제 3 자 라이브러리에 의해 처리되어 순차적으로 호출을 작성할 수 있지만 여전히 다른 스레드에서 호출됩니다.invoke를 사용하여 이벤트를 UI 스레드로 다시 보내는 방법에 대한 링크가 있습니까? – deanvmc

+0

당신은 "Invoke UI Thread C#"에 의해 그것을위한 구글 수 있습니다. 이것은 매우 간단하고 간단합니다 : http://blogs.msdn.com/b/csharpfaq/archive/2004/03/17/91685.aspx – Aliostad

+0

나는 이것을 생각하고 있었다 : http://stackoverflow.com/questions/1698889/raise-events-in-net-on-the-main-ui-thread가 좀 더 동적 인 것처럼 보입니다. – deanvmc

3

이벤트를 비동기 적으로 발생시키고 처리기가 사용자 인터페이스를 업데이트해야하는 경우 사용자 컨트롤을 업데이트하기 위해 UI 스레드와 동기화해야합니다. 이벤트를 비동기 적으로 발생시키는 경우 이벤트에 가입하는 클래스에 큰 부담을줍니다. 즉, UI 스레드 동기화를 수행하는 방법을 알아야합니다.

나를 위해, 일반적으로, 나는 거의 항상 변하지 않게 UI 프로그램에서 이러한 이벤트를 처리해야하기 때문에 비동기 이벤트가 문제가되지 않는 것으로 나타났습니다. 이벤트를 비동기 적으로 처리하려면 처리기가 처리해야한다는 결론에 도달했습니다.

이것은 어렵지 않고 빠른 규칙이 아닙니다. 어떤 수단으로도 아닙니다. 예를 들어 System.Timers.Timer은 기본적으로 ThreadPool 스레드에서 이벤트를 발생 시키지만 SynchronizingObject을 지정하여 UI 스레드와 동기화 할 수 있습니다.

비동기 이벤트로 이동하려면 타이머 클라이언트의 SynchronizingObject과 같은 기능을 포함시켜 UI 클라이언트가 UI 스레드 동기화의 복잡성에 몰두하지 않고도 클래스를 사용할 수 있도록하는 것이 좋습니다.

+0

선택의 여지가 없습니다. WP7로 작업 중이므로 대부분의 응용 프로그램에 필요한 호출은 비동기입니다. – deanvmc

+0

방금 ​​사용하려고했던 스레드를 동기화하는 방법은 무엇입니까? Dispatcher.BeginInvoke (() => { //이 코드는 UI 스레드에 있음 }); 위의 링크에서 fancy 옵션의 많은 부분이 wp7에서 작동하지 않습니다. – deanvmc

관련 문제