PDA

View Full Version : مختصری درباره BackgroundWorker



manitack
پنج شنبه 05 بهمن 1385, 14:41 عصر
سلام به همه دوستان و اساتید با اخلاق و عرض تسلیت به مناسبت ایام سوگواری فرزند یاس دلخون
لازم شد در پروژه ایی از کلاس thread استفاده کنم که به یاد کنترل BackgroundWorkerافتادم. درMSDN مستنداتی برای کار با این کنترل بود که چون در GOOGLE مطلب ترجمه شده ای پیدا نکردم در این تاپیک مطالب زیر را جهت سهولت کار علاقه مندان قرار میدهم. از مطالب و تجربیات و اصلاحات دیگر دوستان پیشاپیش تشکر میکنم.
BackgroundWorker محسوس تر و بصری تر کردن کلاس thread است.یک پروسه زمان بر را به آن میدهیم و BackgroundWorker آن را اصطلاحا در پشت (رابط کاربری و کاربر شما) تا پایان انجام میدهد در حالی که کاربر میتواند در طول این مدت پروسهای دیگر خود را انجام دهد.

BackgroundWorker1.RunWorkerAsync(100): این متد رویداد DoWork را صدا میزند پارامتر آن اختیاری و از نوع object است که در رویداد DoWork توسط متد e.Argument قابل بازیابی است.


BackgroundWorker1.DoWork: کدهای مربوط به پروسه خود را (مثل لود تعداد زیادی رکورد) در این رویداد قراردهید.


BackgroundWorker1.RunWorkerCompleted: وقتی کل پروسه پایان پذیرفت این رویداد صدا زده میشود.

backgroundWorker1.IsBusy: مادامیکه پروسه در حال انجام است و رویداد RunWorkerCompleted صدا زده نشده این خصوصیت مقدار True دارد


BackgroundWorker.ReportProgress(int32): برای استفاده از این متد ابتدا خصوصیت WorkerReportsProgress رابرابر true قراردهید.
این متد رویداد BackgroundWorker.ProgressChanged را صدا میزند و پارامتر خود را در متد e. ProgressPercentage رویداد فوق تحویل میدهد.


BackgroundWorker.ProgressChanged: به راحتی میتوانید در این رویداد پروگرس بار خود را مقداردهی کنید. و کاربر را از روند کار آگاه کنید.


BackgroundWorker.CancelAsync: برای استفاده از این متد ابتدا خصوصیت WorkerSupportsCancellation رابرابر true قراردهید.
این متد باعث کنسل شدن کل پروسه میشود. و خصوصیت BackgroundWorker.CancellationPending را True میکند البته مشخص است که خروجی پروسه تا فراخوانی این متد در اختیار کاربر است.


BackgroundWorker.CancellationPending: بهتر است در طول پروسه مقدار این خصوصیت مرتبا چک شود.

اگر احتیاج به پروژه راهنما هست اعلام کنید تا قرار دهم.
با تشکر شاد و شاد آفرین باشید.

Sub Zero
پنج شنبه 05 بهمن 1385, 15:26 عصر
کارتون عالی بود اگه بتونید کار با کامپیوننتهای ناشناخته دیگه رو هم توضیح بدید عالی می شه مثل کار با Directory Searcher یا File System Watcher

programmermp
پنج شنبه 05 بهمن 1385, 15:44 عصر
کارتون عالی بود اگه بتونید کار با کامپیوننتهای ناشناخته دیگه رو هم توضیح بدید عالی می شه مثل کار با Directory Searcher یا File System Watcher

سلام مصطفی جان

اول بگم که اگه این تاپیک در بخش تاپیکهای مهم عنوان می شد بهتر بود ولی بازم دست اقای

manistak بابت مطلب خوبشون درد نکنه

من در اینجا توضیح کامپوننت file system watcher رو شروع می کنم دیگه اگه شد اون یکی

رو هم می گم نشد باشه واسه دیگر دوستان

این کامپوننت همونطور که خودتون می دونید و از اسمش پیداست کار مانیتورینگ رو بر روی

فایلها و اتفاقاتی که در دایرکتوری ها رخ می ده انجام می ده یک توضیح مختصر و بقیش

در این جا می زارم

مطلب زیر برای اشنایی با این کامپوننت هست من در اینجا یک عذر خواهی بکنم چون فرصت

ترجمه ندارم بنابراین ترجمه اون رو به عهده خودتون می زارم (خداییش خیلی زیاد بود مطالب)



You use the

programmermp
پنج شنبه 05 بهمن 1385, 16:09 عصر
مطلب زیر برای استفاده از این کامپوننت هست



Dim myWatcher As New System.IO.FileSystemWatcher()

پیگربندی این کامپوننت



Dim MyWatcher As New System.IO.FileSystemWatcher()MyWatcher.Path = "c:\"تنظیمات مربوط به کامپوننت هست
' This needs to be declared in a place where it will not go out of scope.' For example, it would be a class variable in a form class.Dim MyWatcher As New System.IO.FileSystemWatcher()' This code would go in one of the initialization methods of the class.MyWatcher.Path = "c:\"' Watch only for changes to *.txt files.MyWatcher.Filter = "*.txt"MyWatcher.IncludeSubdirectories = False' Filter for Last Write changes.MyWatcher.NotifyFilter = System.IO.NotifyFilters.LastWrite' Example of watching more than one type of change.MyWatcher.NotifyFilter = _ System.IO.NotifyFilters.LastAccess Or System.IO.NotifyFilters.Size' Enable the component to begin watching for changes.MyWatcher.EnableRaisingEvents = True در ضمن من یک عذرخواهی هم به شما بدهکارم اونم برای مشکل با این ادیتوره سایت که هر کاری کردم مطالب رو نمی انداخت توی پست سعی می کنم برنامه رو بزارم تا جبران این قضیه بشه

programmermp
پنج شنبه 05 بهمن 1385, 16:51 عصر
این هم یک مثال دیگه برای کلاس فایل واچر که بررسی می کنه ایا فایلی ایجا د شده

یا تغییر پیدا کرده یا نه البته در یک دایرکتوری




Imports System.Diagnostics
Imports System.IO
Public Class Watcher
Public Shared Sub Main()
Run()
End Sub
'<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
Private Shared Sub Run()
Dim args() As String = System.Environment.GetCommandLineArgs()
' If a directory is not specified, exit the program.
If args.Length <> 2 Then
' Display the proper way to call the program.
Console.WriteLine("Usage: Watcher.exe (directory)")
Return
End If
' Create a new FileSystemWatcher and set its properties.
Dim watcher As New FileSystemWatcher()
watcher.Path = args(1)
' Watch for changes in LastAccess and LastWrite times, and
' the renaming of files or directories.
watcher.NotifyFilter = (NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.FileName Or NotifyFilters.DirectoryName)
' Only watch text files.
watcher.Filter = "*.txt"
' Add event handlers.
AddHandler watcher.Changed, AddressOf OnChanged
AddHandler watcher.Created, AddressOf OnChanged
AddHandler watcher.Deleted, AddressOf OnChanged
AddHandler watcher.Renamed, AddressOf OnRenamed
' Begin watching.
watcher.EnableRaisingEvents = True
' Wait for the user to quit the program.
Console.WriteLine("Press 'q' to quit the sample.")
While Chr(Console.Read()) <> "q"c
End While
End Sub
' Define the event handlers.
Private Shared Sub OnChanged(ByVal source As Object, ByVal e As FileSystemEventArgs)
' Specify what is done when a file is changed, created, or deleted.
Console.WriteLine("File: " & e.FullPath & " " & e.ChangeType)
End Sub
Private Shared Sub OnRenamed(ByVal source As Object, ByVal e As RenamedEventArgs)
' Specify what is done when a file is renamed.
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath)
End Sub
End Class



طبق گفته ام اس دی ان بیشتر بدرد مانیتورینگ فایل ها و فولدر ها توی شبکه

می خوره فکر کنم همینطور هم بنظر بیاد

programmermp
پنج شنبه 05 بهمن 1385, 17:00 عصر
در ضمن مصطفی جان

من یک سئوال در راستای مثال های فوق داشتم

من توی فرم دستور زیر رو می نویسم ولی اصلا پنجره کنسول باز نمی شه مشکل چیه



console.write("afadasdasd")

Sub Zero
شنبه 07 بهمن 1385, 00:04 صبح
در ضمن مصطفی جان
من توی فرم دستور زیر رو می نویسم ولی اصلا پنجره کنسول باز نمی شه مشکل چیه


console.write("afadasdasd")

سورس Console Application (http://www.barnamenevis.org/forum/attachment.php?attachmentid=6649&d=1169845285) رو نگاه کن تاپیک Vb 2005 Tips پست شماره 29 (http://www.barnamenevis.org/forum/showthread.php?p=302314&posted=1#post302314)

HAIdle
سه شنبه 15 خرداد 1386, 13:13 عصر
BackgroundWorker.CancelAsync: برای استفاده از این متد ابتدا خصوصیت WorkerSupportsCancellation رابرابر true قراردهید.
این متد باعث کنسل شدن کل پروسه میشود. و خصوصیت BackgroundWorker.CancellationPending را True میکند البته مشخص است که خروجی پروسه تا فراخوانی این متد در اختیار کاربر است.


BackgroundWorker.CancellationPending: بهتر است در طول پروسه مقدار این خصوصیت مرتبا چک شود.

با تشکر شاد و شاد آفرین باشید.

میشه لطف کنید این دو مورد را بیشتر توضیح بدین
مثلا منظورتون از اینکه خروجی پروسه تا فراخوانی این متد در اختیار کاربره چیه

HAIdle
سه شنبه 15 خرداد 1386, 13:34 عصر
یه مشکل دیگه:
من توی رویداد BackgroundWorker1.DoWork به یک combobox دسترسی پیدا می کنم که خطای زیر را می ده:

Cross-thread operation not valid: Control 'vilageComboBox' accessed from a thread other than the thread it was created on.

moallemi
یک شنبه 21 مرداد 1386, 10:49 صبح
یه مشکل دیگه:
من توی رویداد BackgroundWorker1.DoWork به یک combobox دسترسی پیدا می کنم که خطای زیر را می ده:

Cross-thread operation not valid: Control 'vilageComboBox' accessed from a thread other than the thread it was created on.

برای حل این مشکل باید از دستور Controls.CheckForIlligal... استفاده کنی و مقدارش رو false کنی

alireza_tavakol
شنبه 31 شهریور 1386, 02:30 صبح
برای حل این مشکل باید از دستور Controls.CheckForIlligal... استفاده کنی و مقدارش رو false کنی

من هم این مشکل رو دارم یه کم بیشتر توضیح بدین

alireza_tavakol
شنبه 31 شهریور 1386, 02:44 صبح
برای حل این مشکل باید از دستور Controls.CheckForIlligal... استفاده کنی و مقدارش رو false کنی
یه کم بیشتر توضیح بده

PC2st
شنبه 31 شهریور 1386, 04:56 صبح
برای حل این مشکل باید از دستور Controls.CheckForIlligal... استفاده کنی و مقدارش رو false کنی
این کار صورت نگیره بهتره... برای استفاده صحیح از این کلاس بهتره به راهنمای پست اول عمل کنید.
و برای اینکه چنین اروری (مشکلی) پیش نیاد، زمانی که میخواید تغییری در کنترلهای فرم ایجاد کنید، از رویداد BackgroundWorker.ProgressChanged استفاده کنید.