Reading incoming multipart content

When using this snippet the thread goes into some infinite loop.


// Handle multipart
if (Request.Content.IsMimeMultipartContent())
{
   IEnumerable parts
     = Request
       .Content
       .ReadAsMultipartAsync()
       .Result
       .Contents;
   foreach (var part in parts)
   {
      // Do stuff with the part
   }
}

You can use the following to prevent this:

        public HttpResponseMessage Post()
        {
            // Handle multipart
            if (Request.Content.IsMimeMultipartContent())
            {
                IEnumerable parts = null;

                Task.Factory
                    .StartNew(() => parts = Request.Content.ReadAsMultipartAsync().Result.Contents,
                        CancellationToken.None,
                        TaskCreationOptions.LongRunning, // guarantees separate thread
                        TaskScheduler.Default)
                    .Wait();

                foreach (var part in parts)
                {
                    // Do stuff with the part
                }
            }
            return Request.CreateResponse(HttpStatusCode.OK, "Yeah, some text here...");
        }

GuidComb

Copied from the NHibernate implementation

https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Id/GuidCombGenerator.cs

public class GuidCombGenerator
	{

		public static Guid GenerateComb()
		{
			byte[] guidArray = Guid.NewGuid().ToByteArray();

			DateTime baseDate = new DateTime(1900, 1, 1);
			DateTime now = DateTime.Now;

			// Get the days and milliseconds which will be used to build the byte string 
			TimeSpan days = new TimeSpan(now.Ticks - baseDate.Ticks);
			TimeSpan msecs = now.TimeOfDay;

			// Convert to a byte array 
			// Note that SQL Server is accurate to 1/300th of a millisecond so we divide by 3.333333 
			byte[] daysArray = BitConverter.GetBytes(days.Days);
			byte[] msecsArray = BitConverter.GetBytes((long) (msecs.TotalMilliseconds / 3.333333));

			// Reverse the bytes to match SQL Servers ordering 
			Array.Reverse(daysArray);
			Array.Reverse(msecsArray);

			// Copy the bytes into the guid 
			Array.Copy(daysArray, daysArray.Length - 2, guidArray, guidArray.Length - 6, 2);
			Array.Copy(msecsArray, msecsArray.Length - 4, guidArray, guidArray.Length - 4, 4);

			return new Guid(guidArray);
		}
	}