티스토리 뷰

 

 

 

 

 

 

 

 

 

 

 

 

아래 코드에 어떤 문제가 있을까요.

 

private System.Windows.Forms.ListView lvData;

 

private void ReceiveItems(object sender, PublisherEventArgs e)
        {
            Invoke(new MethodInvoker(delegate()
                {
                    try
                    {
                        WriteLog("[" + DateTime.Now.ToString() + "] " + e.eventData);

                        List<StockData> collection = new List<StockData>();

                        lvData.BeginUpdate();
                        ListViewItem item;

                        foreach (string s in sTokens)
                        {

// do something..

                        }
                        lvData.EndUpdate();
                    }
                    catch(Exception ex)
                    {
                        WriteLog( ex.Message.ToString());
                    }
                }));
        } 

 

       

listview가 update될때 beginUpdate()를 호출하고 endUpdate()를 호출 전까지 화면그리기를 중단하도록 합니다. 이유는 컨트롤에 데이터 업뎃이 한번에 깔끔하게 되기위해서 이런 구조를 쓰는데요..

 

exception발생시 EndUpdate()를 호출하지 못하는 상황이 발생합니다.

 

한번 이렇게 꼬여버리면 다음번에 정상적으로 해당 함수들이 호출된다 하더라도 listview는 더이상 정상적으로 작동하지 않게 됩니다. -화면상에 보이지 않게 되는거죠.-

 

그럼 어떻게 해야할까요?

 

 

네.. 아래와 같이 finally구문을 사용하는게 일반적인 방법이 되겠습니다.

 

 

private System.Windows.Forms.ListView lvData;

 

private void ReceiveItems(object sender, PublisherEventArgs e)
        {
            Invoke(new MethodInvoker(delegate()
                {
                    try
                    {
                        WriteLog("[" + DateTime.Now.ToString() + "] " + e.eventData);

                        List<StockData> collection = new List<StockData>();

                        lvData.BeginUpdate();
                        ListViewItem item;

                        foreach (string s in sTokens)
                        {

// do something..

                        }
                         // lvData.EndUpdate();
                    }
                    catch(Exception ex)
                    {
                        WriteLog( ex.Message.ToString());
                    }

                    finally

                    {

                        lvData.EndUpdate();

                    }
                }));
        } 

 

 

 

 

try ~ catch구조에서 꼭 실행되어야만 하는 구문은 finally에 넣는 것 정도의 코딩습관을 들이는게 바람직하지 않을까요?

 

댓글