2013-04-20 2 views
0

C# .NET의 URL에서 이미지를 그리는 응용 프로그램을 만들고 있습니다. 문제는이 요소가로드되는 동안 응용 프로그램이 정지되고 나머지 폼이 그려지지 않는다는 것입니다. 이걸 막기 위해 어쨌든 있습니까?계속 실행하는 동안 페인팅 양식 계속

다른 언어의 공동 루틴처럼이 작업을 수행하는 동안 나머지 프로그램을 계속 실행할 수있는 방법이 있습니다.

 WebRequest aReq = WebRequest.Create(avatarURL); 
     WebResponse aRes = aReq.GetResponse(); 

     Image img = Image.FromStream(aRes.GetResponseStream()); 

     e.Graphics.DrawImage(img, 10, 10, 55, 55); 

내가 스레딩을 사용하여 시도,하지만 난 지금 내 코드를 동작하지 않습니다는 다음과 같습니다

 Thread drawavatar = new Thread(new ThreadStart(() => drawAvatarDetails(e))); 
     while (a_img != null) 
     { 
      e.Graphics.DrawImage(a_img, 10, 10, 55, 55); 
     } 

내부 drawAvatarDetaails 내가 아바타

의 이미지에 글로벌 a_img을 할당
+0

어떻게로드됩니까? 보이지 않는 코드를 최적화하는 것은 매우 어렵습니다. – Ryan

+0

몇 가지 코드를 공유 할 수 있습니까? – aliassce

+0

이미지를 가져 오는 데 사용하는 추가 된 방법 – user2117190

답변

1

단순히 BackGroundWorker을 사용하십시오. 그리고 DoWork 이벤트에서이 작업을 수행하십시오. 물론 전역 변수 안에 이미지를 유지하고 Form의 Paint (또는 컨트롤 페인트) 이벤트에 그려 넣는 것이 좋습니다. 당신은 메인 UI 스레드 이외의 사용자 컨트롤에 액세스하는 경우

BackgroundWorker bw; 
    Image img; 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     bw = new BackgroundWorker(); 
     bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
     bw.RunWorkerAsync(); 
     this.Paint += new PaintEventHandler(Form1_Paint); 
    } 

    void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     if (img != null) 
     { 
      e.Graphics.DrawImage(img, 10, 10, 55, 55); 
     } 
    } 

    void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     WebRequest aReq = WebRequest.Create(avatarURL); 
     WebResponse aRes = aReq.GetResponse(); 
     img = Image.FromStream(aRes.GetResponseStream()); 
    } 
0

, 당신은 cross thread operation not valid 예외를 얻을 것입니다. 따라서 .Net 4.5를 사용하는 경우 사용하는 것이 좋습니다 async/await

async void Draw(string avatarURL) 
{ 
    HttpClient client = new HttpClient(); 
    Image img = Image.FromStream(await client.GetStreamAsync(avatarURL)); 

    // Your drawing code 
    // for ex, this.BackgroundImage = img; 

} 
관련 문제