Basic threading can quite easily be accomplished in C# by employing just a few lines of code.
For this situation it is simply a matter of defining the function you wish to be run as a thread, starting that thread and using ‘join’ as a means of waiting for that thread to finish before continuing with the rest of your code.
The following example show how to launch a function/task as a thread that operates independently of your main control loop:
using System;
using System.Threading;
namespace Threads
{
class Program
{
public static void Main(string[] args)
{
// Create and start the thread
Thread thread = new Thread(new ThreadStart(SomeTaskThatNeedsToFinish));
thread.Start();
// Does not proceed beyond here until thread function has finished
thread.Join();
// Once finished your program is free to continue...
Console.WriteLine("Task completed. Press a key to exit.");
Console.ReadKey();
}
private static void SomeTaskThatNeedsToFinish()
{
// Simulate some task that is going to take ~5sec to finish
Console.WriteLine("Waiting for task to complete...");
Thread.Sleep(5000);
}
}
}
When the programs is started the program is still ‘busy’ doing stuff:
And only continues with the rest of the code when finished:
Using async and await
Async is very useful for tasks that will take an indeterminate length of time, or even fail, such as when accessing a web service. Using the async will enable us to perform other tasks while the asynchronous task is still being carried out.
using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace Threads
{
class Program
{
public static void Main(string[] args)
{
var url = AccessTheWebAsync();
Console.WriteLine("Asynchronous task completed.");
}
// Any function that implements await has to be an async
async static Task<int> AccessTheWebAsync()
{
// GetStringAsync returns Task<string>. When you await the task you'll get a string (urlContents).
// (Can you imagine a world without Microsoft?)
HttpClient client = new HttpClient();
Task<string> getStringTask = client.GetStringAsync("http://www.microsoft.com");
// If GetStringAsync gets completed quickly all well and good.
// If GetStringAsync takes a long time it still won't stop us from executing DoOtherWork
DoOtherWork();
// Resumes when GetStringAsynch complete
string urlContents = await getStringTask;
return urlContents.Length;
}
private static void DoOtherWork()
{
Console.WriteLine("Performing other tasks while still obtaining website string...");
}
}
}

