Skip to content

Instantly share code, notes, and snippets.

@DhavalDalal
Last active May 19, 2019 06:28
Show Gist options
  • Save DhavalDalal/bf98c2162bbcf57b56ac831539d425c5 to your computer and use it in GitHub Desktop.
Save DhavalDalal/bf98c2162bbcf57b56ac831539d425c5 to your computer and use it in GitHub Desktop.
Smelly Locks (C#)

Smelly Locks (C#)

  • Create a Console app project.
  • Make Sure that the code compiles and runs.
  • If you are within a proxy, you can do it programmatically like this:
    System.Net.WebRequest.DefaultWebProxy = new WebProxy(ip,port); 
    
using System;
using System.Net;
using System.Threading;
class Request : IDisposable {
private string data;
private Exception exception;
private readonly string url;
private readonly ReaderWriterLockSlim rwlockSlim;
public Request(string url) {
rwlockSlim = new ReaderWriterLockSlim();
this.url = url;
}
public void Dispose() {
rwlockSlim.Dispose();
}
private void BypassAllCertificates() {
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain,error) => true;
}
private string Send(string url) {
using (WebClient wc = new WebClient()) {
BypassAllCertificates();
return wc.DownloadString(url);
}
}
public void Run() {
rwlockSlim.EnterWriteLock();
try {
Console.WriteLine($"Running({url}) on => {Thread.CurrentThread}({Thread.CurrentThread.Name})");
data = Send(url);
} catch(Exception e) {
this.exception = e;
} finally {
rwlockSlim.ExitWriteLock();
}
}
public string Get() {
rwlockSlim.EnterReadLock();
try {
if (exception == null)
return data;
throw exception;
} finally {
rwlockSlim.ExitReadLock();
}
}
}
using System;
using System.Threading;
using System.Diagnostics;
public class Runner {
public static void Main(string[] args) {
var placesNearbyUrl = "https://geographic-services.herokuapp.com/places/nearby?lat=19.01&lon=72.8&radius=25&unit=km";
var weatherUrl = "https://geographic-services.herokuapp.com/weather?lat=19.01&lon=72.8";
using (var placesNearbyRequest = new Request(placesNearbyUrl)) {
using(var weatherRequest = new Request(weatherUrl)) {
var placesNearbyThread = new Thread(() => placesNearbyRequest.Run());
placesNearbyThread.Name = "placesNearby";
var weatherThread = new Thread(() => weatherRequest.Run());
weatherThread.Name = "weather";
var watch = Stopwatch.StartNew();
placesNearbyThread.Start();
weatherThread.Start();
do {
Console.WriteLine("==========> Waiting For Results.... <==========");
Thread.Sleep(100);
} while (placesNearbyRequest.Get() == null && weatherRequest.Get() == null);
watch.Stop();
Console.WriteLine($"Time Taken {watch.ElapsedMilliseconds}(ms)");
string placesNearbyAndWeatherData = $@"{{ ""weather"" : {weatherRequest.Get()}, ""placesNearby"": {placesNearbyRequest.Get()} }}";
Console.WriteLine(placesNearbyAndWeatherData);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment