I start two threads with a button click and each thread invokes a separate routine and each routine will print thread name and value of i
.
Program runs perfectly, but I saw Thread1()
function running first and then Thread2()
routine starts, but I try to run Thread1()
and Thread2()
both in parallel. Where am I making a mistake?
private void button1_Click(object sender, EventArgs e)
{
Thread tid1 = new Thread(new ThreadStart(Thread1));
Thread tid2 = new Thread(new ThreadStart(Thread2));
tid1.Start();
tid2.Start();
MessageBox.Show("Done");
}
public static void Thread1()
{
for (int i = 1; i <= 10; i++)
{
Console.Write(string.Format("Thread1 {0}", i));
}
}
public static void Thread2()
{
for (int i = 1; i <= 10; i++)
{
Console.Write(string.Format("Thread2 {0}", i));
}
}
You need to give some more work for the threads to make the probability of interleaving high. To see them actually running in parallel, you can use Thread. Sleep() to halt the execution inside the loops. For 500ms, for example.
On a system with more than one processor or CPU cores (as is common with modern processors), multiple processes or threads can be executed in parallel. On a single core though, it is not possible to have processes or threads truly executing at the same time.
Concurrency and Parallelism In the same multithreaded process in a shared-memory multiprocessor environment, each thread in the process can run concurrently on a separate processor, resulting in parallel execution, which is true simultaneous execution.
this way i achieve my goal. here is the code
using System.Threading.Tasks;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Task task1 = Task.Factory.StartNew(() => doStuff("Task1"));
Task task2 = Task.Factory.StartNew(() => doStuff("Task2"));
Task task3 = Task.Factory.StartNew(() => doStuff("Task3"));
Task.WaitAll(task1, task2, task3);
Console.WriteLine("All threads complete");
Console.ReadLine();
}
static void doStuff(string strName)
{
for (int i = 1; i <= 3; i++)
{
Console.WriteLine(strName + " " + i.ToString());
Thread.Yield();
}
}
}
i got a another nice example of Task library from this url https://msdn.microsoft.com/en-us/library/dd460705%28v=vs.110%29.aspx.
using System.Threading;
using System.Threading.Tasks;
using System.Net;
class Program
{
static void Main()
{
// Retrieve Darwin's "Origin of the Species" from Gutenberg.org.
string[] words = CreateWordArray(@"http://www.gutenberg.org/files/2009/2009.txt");
#region ParallelTasks
// Perform three tasks in parallel on the source array
Parallel.Invoke(() =>
{
Console.WriteLine("Begin first task...");
GetLongestWord(words);
}, // close first Action
() =>
{
Console.WriteLine("Begin second task...");
GetMostCommonWords(words);
}, //close second Action
() =>
{
Console.WriteLine("Begin third task...");
GetCountForWord(words, "species");
} //close third Action
); //close parallel.invoke
Console.WriteLine("Returned from Parallel.Invoke");
#endregion
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
#region HelperMethods
private static void GetCountForWord(string[] words, string term)
{
var findWord = from word in words
where word.ToUpper().Contains(term.ToUpper())
select word;
Console.WriteLine(@"Task 3 -- The word ""{0}"" occurs {1} times.",
term, findWord.Count());
}
private static void GetMostCommonWords(string[] words)
{
var frequencyOrder = from word in words
where word.Length > 6
group word by word into g
orderby g.Count() descending
select g.Key;
var commonWords = frequencyOrder.Take(10);
StringBuilder sb = new StringBuilder();
sb.AppendLine("Task 2 -- The most common words are:");
foreach (var v in commonWords)
{
sb.AppendLine(" " + v);
}
Console.WriteLine(sb.ToString());
}
private static string GetLongestWord(string[] words)
{
var longestWord = (from w in words
orderby w.Length descending
select w).First();
Console.WriteLine("Task 1 -- The longest word is {0}", longestWord);
return longestWord;
}
// An http request performed synchronously for simplicity.
static string[] CreateWordArray(string uri)
{
Console.WriteLine("Retrieving from {0}", uri);
// Download a web page the easy way.
string s = new WebClient().DownloadString(uri);
// Separate string into an array of words, removing some common punctuation.
return s.Split(
new char[] { ' ', '\u000A', ',', '.', ';', ':', '-', '_', '/' },
StringSplitOptions.RemoveEmptyEntries);
}
#endregion
}
They are running in parallel. Here is adjusted code to see it better:
private void test()
{
Thread tid1 = new Thread(new ThreadStart(Thread1));
Thread tid2 = new Thread(new ThreadStart(Thread2));
tid1.Start();
tid2.Start();
Console.Write(string.Format("Done"));
}
static void Thread1()
{
for (int i = 1; i <= 10; i++)
{
Console.Write(string.Format("Thread1 {0}", i));
Thread.Yield();
}
}
static void Thread2()
{
for (int i = 1; i <= 10; i++)
{
Console.Write(string.Format("Thread2 {0}", i));
Thread.Yield();
}
}
And here is output: DoneThread1 1Thread2 1Thread1 2Thread2 2Thread1 3Thread2 3Thread1 4Thread2 4Thread1 5Thread2 5Thread1 6Thread2 6Thread1 7Thread2 7Thread1 8Thread2 8Thread1 9Thread2 9Thread1 10Thread2 10
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With