2016-11-22 80 views
0

我正在处理一些针对sql server分析服务执行MDX查询的代码。 MDX查询在同一个线程上执行两次,我不知道为什么。查询应该只执行一次c#线程/查询执行两次

下面是一些代码。任何人都可以帮助请。

 private void Start_QueryWorkers() 
    {    
      foreach (QueryThread th in _QueryWorkers) 
      { 
      SSASQuery q = new SSASQuery();      
      q.QueryText = "SELECT NON EMPTY { [Measures].[count] } ON COLUMNS FROM [cube]";         
      q.queryThread = th;    
      th.WorkerThread.RunWorkerAsync(q); 
     }   
    } 

    private void QueryWorkerThread_DoWork(object sender, DoWorkEventArgs e) 
    { 
     SSASQuery q = e.Argument as SSASQuery;  
     OleDbCommand cmd = new OleDbCommand(q.QueryText, q.queryThread.conn); 
     OleDbDataReader rdr = cmd.ExecuteReader();    
      rdr.Close();   
    } 

     private void btnStartTest_Click(object sender, EventArgs e) 
    {  
      string strConnString = "Provider=MSOLAP;Data Source=SRV001" + ";Initial Catalog=Cube_2015" + ";"; 
     _QueryWorkers.Clear(); 
     {     
      QueryThread thread = new QueryThread(strConnString);   
      thread.WorkerThread = new BackgroundWorker(); 
       thread.WorkerThread.DoWork += new DoWorkEventHandler(this.QueryWorkerThread_DoWork);         
       _QueryWorkers.Add(thread);  
     }        
      Start_QueryWorkers();    
    }    
} 

class SSASQuery 
{ 
    public string QueryText { get; set; }  
    public QueryThread queryThread { get; set; }   
} 

class QueryThread 
{ 
    public QueryThread(string connString) 
    { 
     this.connString = connString; 
     conn = new OleDbConnection(connString); 
     conn.Open();   
     queryList = new SortedList(); 
    } 
    public SortedList queryList { get; set; } 
    public string threadName { get; set; } 
    public string connString { get; set; } 
    public OleDbConnection conn;  
    public BackgroundWorker WorkerThread { get; set; }  
    } 

}

+0

BackgroundWorker不是线程,它是对线程的过时抽象。通过尝试使用它,就好像它是一个线程一样,你什么也得不到。使用PLINQ,Parallel.ForEach或ActionBlock 来并行执行每个查询并将结果存储到任何要存储它们的地方会更容易 –

+0

嗨,好的谢谢您的建议。无论如何,你可以帮助为什么DoWork/BackgroundWorker被执行两次在上面的代码 – DC07

+0

为什么你使用'for(int i = 0;我 McNets

回答

0

解决。代码是好的,这是连接字符串执行查询两次的问题