Note that there are some explanatory texts on larger screens.

plurals
  1. POGeneric class for performing mass-parallel queries. Feedback?
    primarykey
    data
    text
    <p>I don't understand why, but there appears to be no mechanism in the client library for performing many queries in parallel for Windows Azure Table Storage. I've created a template class that can be used to save considerable time, and you're welcome to use it however you wish. I would appreciate however, if you could pick it apart, and provide feedback on how to improve this class.</p> <pre><code>public class AsyncDataQuery&lt;T&gt; where T: new() { public AsyncDataQuery(bool preserve_order) { m_preserve_order = preserve_order; this.Queries = new List&lt;CloudTableQuery&lt;T&gt;&gt;(1000); } public void AddQuery(IQueryable&lt;T&gt; query) { var data_query = (DataServiceQuery&lt;T&gt;)query; var uri = data_query.RequestUri; // required this.Queries.Add(new CloudTableQuery&lt;T&gt;(data_query)); } /// &lt;summary&gt; /// Blocking but still optimized. /// &lt;/summary&gt; public List&lt;T&gt; Execute() { this.BeginAsync(); return this.EndAsync(); } public void BeginAsync() { if (m_preserve_order == true) { this.Items = new List&lt;T&gt;(Queries.Count); for (var i = 0; i &lt; Queries.Count; i++) { this.Items.Add(new T()); } } else { this.Items = new List&lt;T&gt;(Queries.Count * 2); } m_wait = new ManualResetEvent(false); for (var i = 0; i &lt; Queries.Count; i++) { var query = Queries[i]; query.BeginExecuteSegmented(callback, i); } } public List&lt;T&gt; EndAsync() { m_wait.WaitOne(); m_wait.Dispose(); return this.Items; } private List&lt;T&gt; Items { get; set; } private List&lt;CloudTableQuery&lt;T&gt;&gt; Queries { get; set; } private bool m_preserve_order; private ManualResetEvent m_wait; private int m_completed = 0; private object m_lock = new object(); private void callback(IAsyncResult ar) { int i = (int)ar.AsyncState; CloudTableQuery&lt;T&gt; query = Queries[i]; var response = query.EndExecuteSegmented(ar); if (m_preserve_order == true) { // preserve ordering only supports one result per query lock (m_lock) { this.Items[i] = response.Results.Single(); } } else { // add any number of items lock (m_lock) { this.Items.AddRange(response.Results); } } if (response.HasMoreResults == true) { // more data to pull query.BeginExecuteSegmented(response.ContinuationToken, callback, i); return; } m_completed = Interlocked.Increment(ref m_completed); if (m_completed == Queries.Count) { m_wait.Set(); } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload