Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- namespace DeadLockTest.Controllers
- {
- using System;
- using System.IO;
- using System.Net.Http;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Web;
- using System.Web.Http;
- namespace WebApplication1.Controllers
- {
- public class DefaultController : ApiController
- {
- private object _syncRoot = new object();
- [HttpGet]
- [Route("test")]
- public string Get()
- {
- WriteInfo("\n***\nSTART");
- //return BadAssAsync().Result; // deadlocks
- //return Wait(() => BadAssAsync()); // works!
- return Wait1(() => BadAssAsync()); // deadlocks sometimes
- //return Wait2(() => BadAssAsync()); // works!
- }
- private async Task<string> BadAssAsync()
- {
- HttpClient client = new HttpClient();
- WriteInfo("BEFORE AWAIT");
- var response = await client.GetAsync("http://google.com");
- WriteInfo("AFTER AWAIT");
- string content = await response.Content.ReadAsStringAsync();
- WriteInfo("AFTER SECOND AWAIT");
- return content;
- }
- private T Wait<T>(Func<Task<T>> taskGen)
- {
- var t = Task.Run(() =>
- {
- WriteInfo("RUN");
- var task = taskGen();
- return task.Result;
- });
- WriteInfo("WAITING RESULT");
- return t.Result;
- }
- private T Wait1<T>(Func<Task<T>> taskGen)
- {
- return Task.Run(() =>
- {
- WriteInfo("RUN");
- var task = taskGen();
- return task.Result;
- }).Result;
- }
- private T Wait2<T>(Func<Task<T>> taskGen)
- {
- return Task.Run(() =>
- {
- return taskGen();
- }).Result;
- }
- private void WriteInfo(string checkpoint)
- {
- string s = $"{checkpoint}: TID: {Thread.CurrentThread.ManagedThreadId}; SCTX: {SynchronizationContext.Current?.ToString() ?? "<null>"}; SCHEDULER: {TaskScheduler.Current}";
- lock (_syncRoot)
- WriteF(s);
- }
- private void WriteF(string s)
- {
- string dir = HttpRuntime.AppDomainAppPath;
- string path = Path.Combine(dir, "log.txt");
- using (var fs = new FileStream(path, FileMode.Append))
- using (var sw = new StreamWriter(fs))
- {
- sw.WriteLine(s);
- sw.Flush();
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement