public void IsInvalidWhenTargetIsCollected() { MockDelegateTarget mockDelegateTarget = new MockDelegateTarget(); var weakDelegate = new WeakDelegate<Action<object>>(mockDelegateTarget.DelegateMethod); mockDelegateTarget = null; GC.Collect(); Assert.IsFalse(weakDelegate.IsAlive); }
public void RetrieveDelegateOfGarbageCollectedObject() { MockDelegateTarget mockDelegateTarget = new MockDelegateTarget(); var weakDelegate = new WeakDelegate<Action<object>>(mockDelegateTarget.DelegateMethod); mockDelegateTarget = null; GC.Collect(); Assert.IsNull(weakDelegate.Delegate); }
public void RetrieveDelegateOfObjectMethod() { MockDelegateTarget mockDelegateTarget = new MockDelegateTarget(); var weakDelegate = new WeakDelegate<Action<object>>(mockDelegateTarget.DelegateMethod); object dummyParameter = new object(); Delegate d = weakDelegate.Delegate; d.DynamicInvoke(dummyParameter); Assert.IsTrue(mockDelegateTarget.DelegateCalled); Assert.AreSame(dummyParameter, mockDelegateTarget.DelegateParameter); }
public void IsValidAsLongAsTargetIsAlive() { MockDelegateTarget mockDelegateTarget = new MockDelegateTarget(); var weakDelegate = new WeakDelegate<Action<object>>(mockDelegateTarget.DelegateMethod); GC.Collect(); Assert.IsTrue(weakDelegate.IsAlive); object dummyParameter = new object(); weakDelegate.Invoke(dummyParameter); Assert.IsTrue(mockDelegateTarget.DelegateCalled); Assert.AreSame(dummyParameter, mockDelegateTarget.DelegateParameter); }
public void IsAlwaysValidForStaticMethods() { var weakDelegate = new WeakDelegate<Action<object>>(MockStaticDelegateTarget.DelegateMethod); GC.Collect(); Assert.IsTrue(weakDelegate.IsAlive); MockStaticDelegateTarget.Clear(); object dummyParameter = new object(); weakDelegate.Invoke(dummyParameter); Assert.IsTrue(MockStaticDelegateTarget.DelegateCalled); Assert.AreSame(dummyParameter, MockStaticDelegateTarget.DelegateParameter); }
static void OperationLoop(WeakDelegate<Action> loopBodyReference, TimeSpan loopIterationDelay, CancellationToken cancellationToken) { while (true) { if (cancellationToken.IsCancellationRequested) return; try { if (!loopBodyReference.TryExecute()) return; Task.Delay(loopIterationDelay, cancellationToken).Wait(); } catch (ThreadAbortException) { /* expected */ } catch (Exception ex) { InternalTrace.Warning(ex, "Failed executing operation loop"); // TODO notify about error via event (?) } } }
public AsyncLoop(Action loopBody) { this.Name = Guid.NewGuid().ToString(); LoopBodyReference = new WeakDelegate<Action>(this, loopBody); }
public void RetrieveDelegateOfStaticMethod() { var weakDelegate = new WeakDelegate<Action<object>>(MockStaticDelegateTarget.DelegateMethod); MockStaticDelegateTarget.Clear(); object dummyParameter = new object(); Delegate d = weakDelegate.Delegate; d.DynamicInvoke(dummyParameter); Assert.IsTrue(MockStaticDelegateTarget.DelegateCalled); Assert.AreSame(dummyParameter, MockStaticDelegateTarget.DelegateParameter); }
public void MethodInfo() { MockDelegateTarget mockDelegateTarget = new MockDelegateTarget(); var weakDelegate = new WeakDelegate<Action<object>>(mockDelegateTarget.DelegateMethod); Assert.AreEqual("DelegateMethod", weakDelegate.MethodInfo.Name); }
/// <summary> /// Initializes a new instance of the <see cref="HandlerEntry" /> class. /// Initialisiert eine neue Instanz der <see cref="HandlerEntry" /> Klasse. /// Initializes a new instance of the <see cref="HandlerEntry" /> class. /// </summary> /// <param name="methodInfo"> /// The method info. /// </param> /// <param name="target"> /// The target. /// </param> public HandlerEntry(MethodBase methodInfo, object target) { Contract.Requires<ArgumentNullException>(methodInfo != null, "methodInfo"); Contract.Requires<ArgumentNullException>(target != null, "target"); _type = (InvokeType) methodInfo.GetParameters().Length; _delegate = new WeakDelegate(methodInfo, target); }
public void TargetReference() { MockDelegateTarget mockDelegateTarget = new MockDelegateTarget(); var weakDelegate = new WeakDelegate<Action<object>>(mockDelegateTarget.DelegateMethod); Assert.AreEqual(mockDelegateTarget, weakDelegate.TargetReference.Target); mockDelegateTarget = null; GC.Collect(); Assert.IsNull(weakDelegate.TargetReference.Target); }
public void ConstructorShouldThrowExceptionOnNull() { WeakDelegate<Action> weakDelegate = new WeakDelegate<Action>(null); }
public void StaticConstructorShouldThrowExceptionOnNonDelegate() { WeakDelegate<object> weakDelegate = new WeakDelegate<object>(new object()); }
public void RetrieveDelegateTypeOfObjectMethod() { MockDelegateTarget mockDelegateTarget = new MockDelegateTarget(); var weakDelegate = new WeakDelegate<Action<object>>(mockDelegateTarget.DelegateMethod); Assert.AreEqual(typeof(Action<object>), weakDelegate.DelegateType); }
public static T CreateInvoke(WeakDelegate <T> target) { return(_buildInvoke.CreateDelegate <T>(target)); }
public AsyncLoop(string name, Action loopBody) { this.Name = name; LoopBodyReference = new WeakDelegate<Action>(this, loopBody); }
public HidThread(string deviceName, string devicePath, DataReadCallback callback, ThreadExceptionCallback exceptionCallback) { devicename = deviceName; devicepath = devicePath; wdcallback = new WeakDelegate(callback); wdexcallback = new WeakDelegate(exceptionCallback); // Initialize ResourceManager for loading localizable strings rm = new ResourceManager("Strings", Assembly.GetExecutingAssembly()); // Create an event to signal that the thread is up and running ThreadStarted = new ManualResetEvent(false); // Create a new event to signal the thread to terminate ThreadTerminating = new ManualResetEvent(false); }
/// <summary> /// Initializes a new instance of the <see cref="HandlerEntry" /> class. /// Initialisiert eine neue Instanz der <see cref="HandlerEntry" /> Klasse. /// Initializes a new instance of the <see cref="HandlerEntry" /> class. /// </summary> /// <param name="dDelegate"> /// The d delegate. /// </param> public HandlerEntry(Delegate dDelegate) { Contract.Requires<ArgumentNullException>(dDelegate != null, "dDelegate"); _type = (InvokeType) dDelegate.Method.GetParameters().Length; _delegate = new WeakDelegate(dDelegate); }