mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-14 01:25:40 -05:00
* Strings sweep for connection service * String sweep for credentials service * String sweep for hosting * String sweep for query execution service * String sweep for Workspace service * Renaming utility namespace to match standards Renaming Microsoft.SqlTools.EditorServices.Utility to Microsoft.SqlTools.ServiceLayer.Utility to match the naming changes done a while back. Also renaming them on the files that use them * Namespace change on reliable connection * Adding the new resx and designer files * Final bug fixes for srgen Fixing flakey moq package name * Removing todo as per @kevcunnane * Adding using statements as per @llali's comment * Fixing issues from broken unit tests Note: This feature contains changes that will break the contract for saving as CSV and JSON. On success, null is returned as a message instead of "Success". Changes will be made to the vscode component to handle this change.
78 lines
2.3 KiB
C#
78 lines
2.3 KiB
C#
//
|
|
// Copyright (c) Microsoft. All rights reserved.
|
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
//
|
|
|
|
using System;
|
|
using System.Collections.Concurrent;
|
|
using System.Threading;
|
|
|
|
namespace Microsoft.SqlTools.ServiceLayer.Utility
|
|
{
|
|
/// <summary>
|
|
/// Provides a SynchronizationContext implementation that can be used
|
|
/// in console applications or any thread which doesn't have its
|
|
/// own SynchronizationContext.
|
|
/// </summary>
|
|
public class ThreadSynchronizationContext : SynchronizationContext
|
|
{
|
|
#region Private Fields
|
|
|
|
private BlockingCollection<Tuple<SendOrPostCallback, object>> requestQueue =
|
|
new BlockingCollection<Tuple<SendOrPostCallback, object>>();
|
|
|
|
#endregion
|
|
|
|
#region Constructors
|
|
|
|
/// <summary>
|
|
/// Posts a request for execution to the SynchronizationContext.
|
|
/// This will be executed on the SynchronizationContext's thread.
|
|
/// </summary>
|
|
/// <param name="callback">
|
|
/// The callback to be invoked on the SynchronizationContext's thread.
|
|
/// </param>
|
|
/// <param name="state">
|
|
/// A state object to pass along to the callback when executed through
|
|
/// the SynchronizationContext.
|
|
/// </param>
|
|
public override void Post(SendOrPostCallback callback, object state)
|
|
{
|
|
// Add the request to the queue
|
|
this.requestQueue.Add(
|
|
new Tuple<SendOrPostCallback, object>(
|
|
callback, state));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Public Methods
|
|
|
|
/// <summary>
|
|
/// Starts the SynchronizationContext message loop on the current thread.
|
|
/// </summary>
|
|
public void RunLoopOnCurrentThread()
|
|
{
|
|
Tuple<SendOrPostCallback, object> request;
|
|
|
|
while (this.requestQueue.TryTake(out request, Timeout.Infinite))
|
|
{
|
|
// Invoke the request's callback
|
|
request.Item1(request.Item2);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Ends the SynchronizationContext message loop.
|
|
/// </summary>
|
|
public void EndLoop()
|
|
{
|
|
// Tell the blocking queue that we're done
|
|
this.requestQueue.CompleteAdding();
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|
|
|