2016-06-02 2 views
2

상당히 큰 DataSet을 여러 청크로 묶는 방법에 대한 많은 대답이 있습니다.DataTable을 여러 Datatables로 비동기 적으로 분할

그러나 이러한 데이터 집합을 청크하는 동안 UI를 잠그지 않으면 실제로이를 수행하는 방법에 대한 해결책은 없습니다.

이 솔루션은 작동하지만, 나는 async 작동 await로되어있어,하지만 난이 코드에서 기다리고 해야할지하지 않기 때문에 작업이 동 기적으로 실행 :

internal static class ExtensionMethods 
{ 
    internal static async Task<List<DataTable>> CloneTable(DataTable tableToClone, int countLimit) 
    { 
     List<DataTable> tables = new List<DataTable>(); 
     int count = 0; 
     DataTable copyTable = null; 
     foreach (DataRow dr in tableToClone.Rows) 
     { 
      if ((count++ % countLimit) == 0) 
      { 
       copyTable = new DataTable(); 
       copyTable = tableToClone.Clone(); 
       copyTable.TableName = "TableCount" + count; 
       tables.Add(copyTable); 
      } 
      copyTable.ImportRow(dr); 
     } 
     return tables; 
    } 
} 

나는이 얻을 수있는 방법 동기식이 아닌 비동기식으로 실행하려면?

+0

효율성을 위해 비동기를 찾고있는 경우 테이블 처리에 Parallel.ForEach를 사용하는 것이 좋습니다. https://msdn.microsoft.com/en-us/library/dd460720(v=vs.110) .aspx –

+0

async/await에 대해 읽으시겠습니까? 게시하는 메소드는 코드를 기다릴 필요가 없기 때문에 동 기적으로 만 실행됩니다. – DavidG

+0

@DavidG : 다른 전화를 많이 사용하면 async/await를 사용합니다. IO 작업이 없기 때문에이 특별한 경우에 문제가 발생했습니다. – GrammatonCleric

답변

2

이 방법은 IO 작업을 수행하지 않는 것 같으며 현재 동기식으로 실행됩니다. 모든 당신이 필요로하는, 당신이 필요로하는 모든이 작업을하는 동안 UI 스레드를 유지하지 않는 경우

internal static List<DataTable> CloneTable(DataTable tableToClone, int countLimit) 

: 따라서, 당신이 즉, 정상적인 동기 방법으로 다시 전환 제안, 그것은 다음과 같은 서명을 가지고 있는지 확인 당신이 전에 this 키워드를 사용하지 않기 때문에 CloneTable 현재 확장 방법이 아닙니다, 그런데

public async void button1_Click(object sender, EventArgs e) 
{ 
    //Execute CloneTable on a thread-pool thread 
    var tables = await Task.Run(() => ExtensionMethods.CloneTable(table, 4)); 

    //Use the tables here. This code will run on the UI thread 
    //so you can access any UI elements here 
    ... 
} 

: 할 것은이 방법이 같은 UI 이벤트 핸들러를 형성 호출 할 때 스레드 풀 스레드를 사용하는 것입니다 tableToClone 변수.

+0

내 타입/객체 앞에 확장 키워드로 'this' 키워드를 지정해야한다는 생각이 전혀 들지 않았습니다. 나는이 스코프를 현재 스코프의 멤버에게 가리 키기 위해 사용 된 느낌을 받았기 때문에 실제로 사용하지 않습니다. 수업 주셔서 감사합니다 :) – GrammatonCleric

+0

당신은 오신 것을 환영합니다. 확장 방법 [여기] (https://msdn.microsoft.com/en-us//library/bb383977.aspx)을 읽을 수 있습니다. –

관련 문제