I know that the compiler can sometimes omit methods if it thinks it doesn't use anything, and that you can get around this by referring to the method directly in your code to make the compiler turn it on. However, in this case it does not work.
Here's the exception and call stack:
System.ExecutionEngineException: Attempting to JIT compile method '(wrapper managed-to-native) System.Threading.Interlocked:Exchange (System.Threading.Tasks.IContinuation&,System.Threading.Tasks.IContinuation)' while running with --aot-only. See http://docs.xamarin.com/ios/about/limitations for more information. at System.Threading.Tasks.TaskCompletionQueue`1[System.Threading.Tasks.IContinuation].TryGetNextCompletion (IContinuation& continuation) [0x00000] in <filename unknown>:0 at System.Threading.Tasks.Task.ProcessCompleteDelegates () [0x0001b] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Threading.Tasks/Task.cs:521 at System.Threading.Tasks.Task.HandleGenericException (System.AggregateException e) [0x0001a] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Threading.Tasks/Task.cs:563 at System.Threading.Tasks.Task.TrySetException (System.AggregateException aggregate) [0x0003e] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Threading.Tasks/Task.cs:440 at System.Threading.Tasks.TaskCompletionSource`1[System.Net.WebResponse].TrySetException (IEnumerable`1 exceptions) [0x00000] in <filename unknown>:0 at System.Threading.Tasks.TaskCompletionSource`1[System.Net.WebResponse].SetException (IEnumerable`1 exceptions) [0x00000] in <filename unknown>:0 at System.Threading.Tasks.TaskCompletionSource`1[System.Net.WebResponse].SetException (System.Exception exception) [0x00000] in <filename unknown>:0 at System.Threading.Tasks.TaskFactory`1[System.Net.WebResponse].InnerInvoke (System.Threading.Tasks.TaskCompletionSource`1 tcs, System.Func`2 endMethod, IAsyncResult l) [0x00000] in <filename unknown>:0 at System.Threading.Tasks.TaskFactory`1+<FromAsyncBeginEnd>c__AnonStorey21[System.Net.WebResponse].<>m__15 (IAsyncResult l) [0x00000] in <filename unknown>:0 at Vistian.Net.Http.HttpRequestProcessor+<BeginGetResponse>c__AnonStorey3.<>m__5 (IAsyncResult result) [0x00082] in /Users/martinstafford/Projects/Vistian/vistian/common/Vistian.Net/trunk/Vistian.Net.Portable/Http/HttpRequestProcessor.cs:441 at System.Net.WebAsyncResult.CB (System.Object unused) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/WebAsyncResult.cs:148
I tried to include this line in the constructor for a class with a problem in it, but the error still occurs:
object dummy = System.Threading.Interlocked.Exchange( ref dummyLock, new object());
Here is the error code. Sorry, but the way it is in context. An exception is thrown when calling callback - any of them. As you can see, I am trying to implement an asynchronous programming model for a class that includes two asynchronous operations GetRequestStream and GetResponse:
public static IAsyncResult BeginGetResponse(AsyncCallback callback, object state) { var requestProcessor = state as HttpRequestProcessor; // create the Uri of the Host and Path in the request // and use it to create a HttpWebRequest Uri u = new Uri(new Uri(requestProcessor.Request.Host), requestProcessor.Request.Path); requestProcessor.HttpWebRequest = WebRequest.Create(u) as HttpWebRequest; // set up the header of the HttpWebRequest requestProcessor.SetupHeader(requestProcessor.HttpWebRequest, requestProcessor.Request); requestProcessor.WebResponse = null; requestProcessor.RaisedException = null; // set up an event to be used to 'timeout' the forthcoming async process var syncRef = new System.Threading.AutoResetEvent(false); System.Diagnostics.Debug.WriteLine(string.Format("HttpRequestProcessor.BeginGetResponse: started method={0}", requestProcessor.Request.Method)); // perform the request using the Async method // GET and POST requests are processed differently if (requestProcessor.Request.Method == HttpMethod.POST) { // create the request content using the serialiser var bytes = requestProcessor.Encoder.Encode(requestProcessor.Request.Data, requestProcessor.Request.ContentType); System.Diagnostics.Debug.WriteLine("HttpRequestProcessor.BeginGetResponse: BeginGetRequestStream started"); // start the async process by adding the content to the request requestProcessor.HttpWebRequest.BeginGetRequestStream((IAsyncResult result) => { // the asyncronous Get RequestStream has finished in some way // complete the Get RequestStream process by calling EndGetRequestStream // get the HttpWebRequest provided in the 'state' parameter and // use it to call EndGetRequestStream var request = result.AsyncState as HttpWebRequest; try { // fill the request stream with the content using (Stream requestStream = request.EndGetRequestStream(result)) { requestStream.Write(bytes, 0, bytes.Length); } System.Diagnostics.Debug.WriteLine("HttpRequestProcessor.BeginGetResponse: EndGetRequestStream"); } catch (Exception e) { // if the filling of the request stream fails, finish the Async process here System.Diagnostics.Debug.WriteLine(string.Format("HttpRequestProcessor.BeginGetResponse: EndGetRequestSteam failed. Uri={0}", request.RequestUri)); // remember the exception, to be picked up by the subsequent call in to EndGetResponse requestProcessor.RaisedException = e; // clear the timeout event to indicate the async process has finished syncRef.Set(); // call the callback as the async process is finished callback(new AsyncResult(requestProcessor, true)); return; } System.Diagnostics.Debug.WriteLine("HttpRequestProcessor.BeginGetResponse: BeginGetResponse started"); // the HttpWebRequest has the request content in it // send the request and get the response request.BeginGetResponse((IAsyncResult responseResult) => { // the Async process GetResponse has finished in some way // get the HttpWebRequest provided as a parameter and use it // to complete the GetRespone process HttpWebRequest req = responseResult.AsyncState as HttpWebRequest; try { requestProcessor.WebResponse = req.EndGetResponse(responseResult); System.Diagnostics.Debug.WriteLine("HttpRequestProcessor.BeginGetResponse: EndGetResponse"); } catch (Exception e) { // if getting the response fails, catch and remember the exception // for the subsequent call in to EndGetResponse System.Diagnostics.Debug.WriteLine(string.Format("HttpRequestProcessor.BeginGetResponse: EndGetResponse failed. Uri={0}", req.RequestUri)); requestProcessor.RaisedException = e; } // clear the timeout timer event syncRef.Set(); // call the async callback callback(new AsyncResult(requestProcessor, true)); System.Diagnostics.Debug.WriteLine("HttpRequestProcessor.BeginGetResponse: POST callback complete"); }, request); }, requestProcessor.HttpWebRequest); } else { requestProcessor.HttpWebRequest.BeginGetResponse((IAsyncResult responseResult) => { HttpWebRequest req = responseResult.AsyncState as HttpWebRequest; try { requestProcessor.WebResponse = req.EndGetResponse(responseResult); System.Diagnostics.Debug.WriteLine("HttpRequestProcessor.BeginGetResponse: EndGetResponse"); } catch (Exception e) { System.Diagnostics.Debug.WriteLine(string.Format("HttpRequestProcessor.BeginGetResponse: EndGetResponse failed. Uri={0}", req.RequestUri)); requestProcessor.RaisedException = e; } syncRef.Set(); callback(new AsyncResult(requestProcessor, true)); System.Diagnostics.Debug.WriteLine("HttpRequestProcessor.BeginGetResponse: GET callback complete"); }, requestProcessor.HttpWebRequest); } // wait for the async process to finish or timeout if (!syncRef.WaitOne(requestProcessor.Request.Timeout)) { // async process has time out System.Diagnostics.Debug.WriteLine("HttpRequestProcessor.BeginGetResponse: BeginGetStreamRequest timed out"); // abort the async process and create and remember an exception // to be picked up by the call in the EndGetResponse requestProcessor.HttpWebRequest.Abort(); requestProcessor.RaisedException = new TimeoutException("loading request stream timed out"); } return new AsyncResult(requestProcessor, false); } public static WebResponse EndGetResponse(IAsyncResult result) { System.Diagnostics.Debug.WriteLine("HttpRequestProcessor.EndGetResponse:"); var requestProcessor = result.AsyncState as HttpRequestProcessor; if (requestProcessor.RaisedException != null) { throw requestProcessor.RaisedException; } return requestProcessor.WebResponse; }