Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Làm thế nào để đồng bộ hóa quyền truy cập vào một nguồn lực được chia sẻ trong một môi trường đa luồng bằng cách sử dụng Visual C#

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:816161
TÓM TẮT
Bạn có thể thực hiện nhiều nhiệm vụ trong Microsoft Visual C# các ứng dụng cùng một lúc bằng cách sử dụng đa luồng. Multithreading có thể bắt đầu chủ đề khác nhau để hoàn thành nhiệm vụ khác nhau cùng một lúc. Multithreading cũng cải thiện hiệu suất và để đáp ứng các ứng dụng của bạn.

Bởi vì nhiều chủ đề có thể truy cập một nguồn lực cùng một lúc, bạn có thể đồng bộ hóa cá nhân chủ đề với các bộ phận khác của chương trình của bạn. Bài viết này mô tả một số chung kịch bản với lập trình đa luồng, và giải thích làm thế nào để đồng bộ hóa các truy cập vào một nguồn lực được chia sẻ giữa các chủ đề của nhiều.

Quay lại đầu trang

Trợ giúp để bảo vệ dữ liệu toàn cầu trong mô-đun trong một môi trường Multithreaded

Các lĩnh vực công cộng trong phương pháp có thể truy cập tất cả các chủ đề ứng dụng của bạn. Để đồng bộ hóa quyền truy cập vào các lĩnh vực công cộng, bạn có thể sử dụng tài sản thay vì của lĩnh vực này, và sử dụng một ReaderWriterLock đối tượng để kiểm soát quyền truy cập. Để thực hiện việc này, hãy làm theo những bước sau:
  1. Bắt đầu Microsoft Visual Studio.
  2. Trên các Tệp trình đơn, điểm đến Mới, sau đó bấm Dự án.
  3. Nhấp vàoVisual C# các dự án dưới Các loại dự án, và sau đó bấm Giao diện điều khiển ứng dụng dướiKhuôn mẫu.

    Chú ý Trong Visual Studio 2005 hoặc trong Visual Studio 2008, nhấp vào Visual C# dưới Các loại dự án, và sau đó bấm Giao diện điều khiển ứng dụng dướiKhuôn mẫu.
  4. Trong các Tên hộp văn bản, loạiMultiThreadApplication, sau đó bấmOk.
  5. Thay thế mã hiện có với đoạn mã sau trong Class1.cs.

    Chú ý Trong Visual Studio 2005 và trong Visual Studio 2008, tập tin mặc định là Program.cs.
    using System;using System.Threading;namespace MultiThreadApplication{	class Class1	{		private ReaderWriterLock rwl = new ReaderWriterLock();		private long myNumber;		public long Number   // the Number property		{			get			{				//Acquire a read lock on the resource.				rwl.AcquireReaderLock(Timeout.Infinite);                				try				{					Console.WriteLine("Thread:{0} starts getting the Number", Thread.CurrentThread.GetHashCode());					Thread.Sleep(50);					Console.WriteLine("Thread:{0} got the Number", Thread.CurrentThread.GetHashCode());				}				finally				{					//Release the lock.					rwl.ReleaseReaderLock();				}				return myNumber;			}			set			{				//Acquire a write lock on the resource.				rwl.AcquireWriterLock(Timeout.Infinite);				try				{					Console.WriteLine("Thread: {0} start writing the Number", Thread.CurrentThread.GetHashCode());					Thread.Sleep(50);					myNumber = value;					Console.WriteLine("Thread: {0} written the Number", Thread.CurrentThread.GetHashCode());				}				finally				{					//Release the lock.					rwl.ReleaseWriterLock();				}			}		}				[STAThread]		static void Main(string[] args)		{			Thread []threadArray = new Thread[20]; 			int threadNum;			Class1 Myclass = new Class1();			ThreadStart myThreadStart = new ThreadStart(Myclass.AccessGlobalResource);			//Create 20 threads.			for( threadNum = 0; threadNum < 20; threadNum++)			{				threadArray[threadNum] = new Thread(myThreadStart);			}			//Start the threads.			for( threadNum = 0; threadNum < 20; threadNum++)			{   				threadArray[threadNum].Start();			}			//Wait until all the thread spawn out finish.			for( threadNum = 0; threadNum < 20; threadNum++)				threadArray[threadNum].Join();			Console.WriteLine("All operations have completed. Press enter to exit");			Console.ReadLine();		}		public void AccessGlobalResource()		{			Random rnd = new Random();			long theNumber;						if (rnd.Next() % 2 != 0)				theNumber = Number;			else			{				theNumber = rnd.Next();				Number = theNumber;			}		}	}}
  6. Xây dựng dự án, và sau đó chạy các ứng dụng.
Quay lại đầu trang

Trợ giúp để làm cho lớp học của bạn Thread-Safe

Chủ đề của nhiều có thể thử truy cập vào một đối tượng cùng một thời gian. Khi nhiều hơn một thread cạnh tranh để truy cập vào một đối tượng cùng lúc đó, một số chủ đề có thể nhận được một nhà nước không hợp lệ nếu khác chủ đề sửa đổi các tài nguyên cùng một lúc. Ví dụ, nếu một thread lần đọc lĩnh vực đối tượng trong khi chủ đề khác việc sửa đổi các lĩnh vực, các chủ đề đầu tiên có thể nhận trạng thái không hợp lệ của trường. Tình hình này là tên là một điều kiện chủng tộc.

Để tránh tình trạng này, bạn có thể giúp bảo vệ phần quan trọng của mã của bạn từ điều kiện chủng tộc bằng cách sử dụng ổ khóa. Một khóa, đại diện bởi Visual C# từ khóa khóa tuyên bố, cho phép một thread duy nhất của thực hiện để có được thực hiện độc quyền quyền trên một đối tượng. Sau đây Ví dụ bước chứng minh khóa:
  1. Mở phòng thu trực quan.
  2. Trên các Tệp trình đơn, điểm đến Mới, sau đó bấm Dự án.
  3. Nhấp vàoVisual C# các dự án dưới Các loại dự án, và sau đó bấm Giao diện điều khiển ứng dụng dướiKhuôn mẫu.

    Chú ý Trong Visual Studio 2005 hoặc trong Visual Studio 2008, nhấp vào Visual C# dưới Các loại dự án, và sau đó bấm Giao diện điều khiển ứng dụng dướiKhuôn mẫu.
  4. Trong các Tên hộp văn bản, loạiMultiThreadLockApplication, sau đó bấmOk.
  5. Thay thế mã hiện có với đoạn mã sau trong Class1.CS:
    using System;using System.Threading;namespace MultiThreadLockApplication{	class Student	{		private static string myTeacherName = "Bill";		private string myName = "Grace";		private static object somePrivateStaticObject = new Object();		public static string TeacherName		{			get			{				string theName;				// Synchronize access to the shared member.				lock(somePrivateStaticObject)				{					Console.WriteLine("Thread {0} starts to get the teacher's name",Thread.CurrentThread.GetHashCode());					theName = myTeacherName;					// Wait for 0.3 second.					Thread.Sleep(300);					Console.WriteLine("Thread {0} finished to get the teacher's name:{1}.", Thread.CurrentThread.GetHashCode(), theName);				}				return theName;			}			set			{				lock(somePrivateStaticObject)				{					Console.WriteLine("Thread {0} starts to set the teacher's name.", Thread.CurrentThread.GetHashCode());					myTeacherName = value;					// Wait for 0.3 second.					Thread.Sleep(300);					Console.WriteLine("Thread {0} finished to set the teacher's name:{1}.", Thread.CurrentThread.GetHashCode(), value);				}			}		}		public string GetName()		{			string theName;			lock(this)			{				Console.WriteLine("Thread {0} starts to get the student's name.", Thread.CurrentThread.GetHashCode());				theName = myName;				// Wait for 0.3 second.				Thread.Sleep(300);				Console.WriteLine("Thread {0} finished to get the student's name:{1}", Thread.CurrentThread.GetHashCode(), theName);				return theName;			}		}		public string SetName(string NewName)		{			string theOldName;			lock(this)			{				Console.WriteLine("Thread {0} starts to set the student's name.", Thread.CurrentThread.GetHashCode());				theOldName = myName;				myName = NewName;				// Wait for 0.3 second.				Thread.Sleep(300);				Console.WriteLine("Thread {0} finished to set the student's name:{1}", Thread.CurrentThread.GetHashCode(), NewName);			}			return theOldName;		}	}	class Class1	{		public static int WorkItemNum = 20;		public static AutoResetEvent Done = new AutoResetEvent(false);		public static void AccessClassResource(object state)		{			Random rnd = new Random();			string theName;			Student AStudent = (Student) state;			if( (rnd.Next() %2) != 0)			{				if( (rnd.Next() %2) != 0)				{					switch (rnd.Next() %3 )					{						case 0:							Student.TeacherName = "Tom";							break;						case 1:							Student.TeacherName = "Mike";							break;						case 2:							Student.TeacherName = "John";							break;					}				}				else				{					theName = Student.TeacherName;				}			}			else			{				if( (rnd.Next() %2) != 0)				{					switch (rnd.Next() %3 )					{						case 0:							AStudent.SetName("Janet");							break;						case 1:							AStudent.SetName("David");							break;						case 2:							AStudent.SetName("Ben");							break;					}				}				else				{					theName = AStudent.GetName();				}			}			if(Interlocked.Decrement( ref WorkItemNum) == 0)			{				Done.Set();			}		}		[STAThread]		static void Main(string[] args)		{			int threadNum;			Student AStudent = new Student();			// Queue up 20 work items in the ThreadPool.			for (threadNum = 0 ; threadNum <= WorkItemNum -1 ; threadNum++) 			{				ThreadPool.QueueUserWorkItem(new WaitCallback(AccessClassResource),AStudent);			}			Done.WaitOne();			Console.WriteLine("All operations have completed. Press enter to exit");			Console.ReadLine();		}	}}
  6. Xây dựng dự án, và sau đó chạy các ứng dụng.
Quay lại các đầu trang
THAM KHẢO
Để biết thêm chi tiết, xem các sau các trang Web của nhà phát triển Microsoft mạng (MSDN):Quay lại các đầu trang

Cảnh báo: Bài viết này đã được dịch tự động

Thuộc tính

ID Bài viết: 816161 - Xem lại Lần cuối: 08/28/2011 09:14:00 - Bản sửa đổi: 2.0

Microsoft Visual C# 2008 Express Edition, Microsoft Visual C# 2005 Express Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition

  • kbthreadsync kbthread kbhowtomaster kbmt KB816161 KbMtvi
Phản hồi