Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

59 lines
1.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using System.Threading;
namespace MonoTests.Features.Contracts
{
// Define a service contract.
[ServiceContract (Namespace = "http://MonoTests.Features.Contracts")]
public interface IAsyncPattern
{
[OperationContractAttribute (AsyncPattern = true)]
IAsyncResult BeginAsyncMethod (AsyncCallback callback, object asyncState);
int EndAsyncMethod (IAsyncResult result);
// TODO: Need to investigate asyn methods that have ref/out params that are not necessarily first
// e.g. how does foo(in, ref, out, in) map to AsyncPattern?
}
public class AsyncPatternServer : IAsyncPattern
{
// Simple async result implementation.
class CompletedAsyncResult<T> : IAsyncResult
{
T data;
object state;
public CompletedAsyncResult (T data, object state) { this.data = data; this.state = state; }
public T Data { get { return data; } }
#region IAsyncResult Members
public object AsyncState { get { return (object) state; } }
public WaitHandle AsyncWaitHandle { get { throw new Exception ("The method or operation is not implemented."); } }
public bool CompletedSynchronously { get { return true; } }
public bool IsCompleted { get { return true; } }
#endregion
}
public IAsyncResult BeginAsyncMethod (AsyncCallback callback, object asyncState) {
IAsyncResult result = new CompletedAsyncResult<int> (3, asyncState);
new Thread (new ThreadStart (
delegate {
callback (result);
})).Start ();
return result;
}
public int EndAsyncMethod (IAsyncResult r) {
return ((CompletedAsyncResult<int>) r).Data;
}
}
}