Files

49 lines
1.5 KiB
C#

#if NETCF
using System;
using System.Windows.Forms;
using System.Threading;
namespace InTheHand.Net.Bluetooth
{
static class AsyncOperationManager
{
static LocalDataStoreSlot _slotCachedAutoSyncCtx;
static AsyncOperationManager()
{
_slotCachedAutoSyncCtx = Thread.AllocateDataSlot();
}
public static AsyncOperation CreateOperation(object userState)
{
System.Windows.Forms.Control c = GetSyncCtx();
return new AsyncOperation(c, userState);
}
//public static bool AssumeWinFormsSynchronizationContext { get; set; }
readonly static bool AssumeWinFormsSynchronizationContext = true;
static Control GetSyncCtx()
{
//if (_manualSyncCtx != null) { return _manualSyncCtx; }
if (AssumeWinFormsSynchronizationContext) {
// Create a Control on which to marshal. There better be a
// message-loop or the event will never be raised.
// For performance (finalization etc) try and create only one
// [per message-loop -- which should be one is most apps!!].
// (No need for thread safety as we ARE thread-static!)
Control cached = (Control)Thread.GetData(_slotCachedAutoSyncCtx);
if (cached != null)
return cached;
var c = new Control();
Thread.SetData(_slotCachedAutoSyncCtx, c);
return c;
}
return null;
}
}
}
#endif