none
winrt에서 Thread를 사용하는 방법이 없을까요? 그래프를 그리는 동안 app이 잠시 멈춤상태가 되어버려요. RRS feed

  • 질문

  • 제가 그래프를 필요로 하는 앱을 만들거든요.. 그래프에 꺽은선 그래프가 23개가 들어가는데

    그거때문에 그런지 그리는 동안 app이 잠시 정지상태가 되어버리거든요.

    저는 앱이 그래프를 그리는 동안에서 정지가 안되었으면 합니다.

    wpf했을 경우는 Thread thread = new Thread(...) 이런식으로 했는데

    Winrt에서는 어떻게 해야할지 모르겠네요.

    제가 만든 소스를 올립니다. 예제좀 봐주세요..ㅠㅠ

     private async void usingSubway()          // 이용현황
            {
                List<List<user>> LIST = new List<List<user>>();
                List<string> lineList = new List<string>();

                await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low, () =>
                {
                    XDocument load = XDocument.Load("Data/used");              // xml파일 가져옴
                    var result = from rows in load.Descendants("row")
                                 select rows.Element("LINE_NM").Value + "/" +
                                 rows.Element("JAN").Value + "/" +
                                 rows.Element("FEB").Value + "/" +
                                 rows.Element("MAR").Value + "/" +
                                 rows.Element("APR").Value + "/" +
                                 rows.Element("MAY").Value + "/" +
                                 rows.Element("JUN").Value + "/" +
                                 rows.Element("JUL").Value + "/" +
                                 rows.Element("AUG").Value + "/" +
                                 rows.Element("SEP").Value + "/" +
                                 rows.Element("OCT").Value + "/" +
                                 rows.Element("NOV").Value + "/" +
                                 rows.Element("DEC").Value;

                    foreach (string item in result)
                    {
                        string[] tmpstr = item.Split('/');
                        lineList.Add(tmpstr[0]);
                        List<user> tmplist = new List<user>();
                        for (int j = 1; j < tmpstr.Length; j++)
                        {
                            tmplist.Add(new user(j + "월", tmpstr[j]));
                        }
                        LIST.Add(tmplist);                                       // list로 저장(총 23개의 리스트가 나옵니다.)
                    }
                });
                makeGraph(LIST, lineList);
            }

            private void makeGraph(List<List<user>> LIST, List<string> lineList)              // 그래프 그리기
            {
                    Chart MixedChart = (Chart)MainSubwayUse.FindName("Chart");             // 그래프 불러오기
                    Grid grid = new Grid();                                // 그래프 인덱스
                    grid.HorizontalAlignment = Windows.UI.Xaml.HorizontalAlignment.Right;
                    grid.VerticalAlignment = Windows.UI.Xaml.VerticalAlignment.Stretch;
                    grid.Width = 100;
                    grid.Margin = new Thickness(5);
                    for (int g = 0; g < 2; g++)
                    {
                        ColumnDefinition col = new ColumnDefinition();
                        if (g == 0)
                        {
                            col.Width = new GridLength(20);
                        }
                        grid.ColumnDefinitions.Add(col);
                    }
                    for (int k = 0; k < lineList.Count; k++)
                    {
                        RowDefinition row = new RowDefinition();
                        grid.RowDefinitions.Add(row);
                        TextBlock text = new TextBlock();
                        Grid.SetRow(text, k);
                        Grid.SetColumn(text, 1);
                        text.Text = lineList[k];
                        text.Foreground = new SolidColorBrush(Colors.Black);
                        grid.Children.Add(text);
                    }

                    for (int i = 0; i < LIST.Count; i++)
                    {
                        ((LineSeries)MixedChart.Series[i]).ItemsSource = LIST[i];                      // 그래프에 리스트값 적용시키기
                    }

                    grid.Background = new SolidColorBrush(Colors.White);

                    MainSubwayUse.Children.Add(grid);                 // 그래프 추가하기
            }

    2013년 9월 4일 수요일 오전 7:28

답변

  • 아시는 것처럼 Windows Store app은 Thread를 지원하지 않습니다.

    그리고 스레드 풀(Thread Pool)을 이용해서 작업들을 병렬처리합니다.

    http://msdn.microsoft.com/ko-kr/library/windows/apps/hh465290

    스레드 풀을 이용한 작성 가이드는 아래 링크를 따라가면 있습니다.

    http://msdn.microsoft.com/ko-kr/library/windows/apps/jj248677

    그리고 말씀하시는 것을 보면 그래프를 그리는 makeGraph()가 가장 무거운 작업 같은데, 비동기가 목적인만큼 위 코드에서는 이것도 Dispatcher.RunAsync() 안으로 넣어보시는 것은 어떨까 싶네요.

    • 답변으로 표시됨 Jina Lee 2013년 9월 24일 화요일 오전 9:04
    2013년 9월 5일 목요일 오전 2:54
  • 또 다른 방법을 제안하자면, MainSubwayUse가 Main XAML에 있는 컨트롤로 보이고 이곳에 업데이트를 하시려는 것으로 보이는데, 각 컨트롤마다 Dispatcher를 가지고 있고 이것 또한 RunAsycn()를 가지고 있습니다.

    그러므로, makeGraph()의 내용을 RunAsync()를 통해서 구현하는 것이 어떨까 싶네요.

    또한 await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low...) 이 라인은 Task.Wait()이나 작업 완료 이벤트가 없기 때문에 성능에 따라서는 (List<List<user>>) LIST와 (List<string>) lineList가 제대로 생성되기 전에 makeGraph()가 실행될 수 있는 가능성도 있어보입니다. Dispatcher.RunAsync()의 내용과 makeGraph()는 동기가 맞아야 정확하게 UI를 업데이트 할 수 있기 때문에 하나의 블럭으로 묶어야 할 것으로 생각됩니다.

    마지막으로 이렇게 부분적인 코드로 봐서는 usingSubway() 내의 'Dispatcher'가 어느 컨트롤에 종속된 것인지 모르겠고, 드릴 수 있는 조언은 이 정도일 것 같습니다.

    • 답변으로 표시됨 Jina Lee 2013년 9월 24일 화요일 오전 9:04
    2013년 9월 5일 목요일 오전 8:00

모든 응답

  • 아시는 것처럼 Windows Store app은 Thread를 지원하지 않습니다.

    그리고 스레드 풀(Thread Pool)을 이용해서 작업들을 병렬처리합니다.

    http://msdn.microsoft.com/ko-kr/library/windows/apps/hh465290

    스레드 풀을 이용한 작성 가이드는 아래 링크를 따라가면 있습니다.

    http://msdn.microsoft.com/ko-kr/library/windows/apps/jj248677

    그리고 말씀하시는 것을 보면 그래프를 그리는 makeGraph()가 가장 무거운 작업 같은데, 비동기가 목적인만큼 위 코드에서는 이것도 Dispatcher.RunAsync() 안으로 넣어보시는 것은 어떨까 싶네요.

    • 답변으로 표시됨 Jina Lee 2013년 9월 24일 화요일 오전 9:04
    2013년 9월 5일 목요일 오전 2:54
  • 또 다른 방법을 제안하자면, MainSubwayUse가 Main XAML에 있는 컨트롤로 보이고 이곳에 업데이트를 하시려는 것으로 보이는데, 각 컨트롤마다 Dispatcher를 가지고 있고 이것 또한 RunAsycn()를 가지고 있습니다.

    그러므로, makeGraph()의 내용을 RunAsync()를 통해서 구현하는 것이 어떨까 싶네요.

    또한 await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low...) 이 라인은 Task.Wait()이나 작업 완료 이벤트가 없기 때문에 성능에 따라서는 (List<List<user>>) LIST와 (List<string>) lineList가 제대로 생성되기 전에 makeGraph()가 실행될 수 있는 가능성도 있어보입니다. Dispatcher.RunAsync()의 내용과 makeGraph()는 동기가 맞아야 정확하게 UI를 업데이트 할 수 있기 때문에 하나의 블럭으로 묶어야 할 것으로 생각됩니다.

    마지막으로 이렇게 부분적인 코드로 봐서는 usingSubway() 내의 'Dispatcher'가 어느 컨트롤에 종속된 것인지 모르겠고, 드릴 수 있는 조언은 이 정도일 것 같습니다.

    • 답변으로 표시됨 Jina Lee 2013년 9월 24일 화요일 오전 9:04
    2013년 9월 5일 목요일 오전 8:00