I need to make RunWorkerAsync()
return a List<FileInfo>
. How can I return an object from a background worker?
相关问题
- Sorting 3 numbers without branching [closed]
- Graphics.DrawImage() - Throws out of memory except
- Why am I getting UnauthorizedAccessException on th
- 求获取指定qq 资料的方法
- How to know full paths to DLL's from .csproj f
I'm assuming that you don't want to block and wait on RunWorkerAsync() for the results (if you did, there would be no reason to run async!
If you want to be notified when the background process finishes, hook the RunWorkerCompleted Event. If you want to return some state, return it in the Result member of DoWork's event args.
EDIT: I posted prematurely -- finished my code example
Example:
Depending on your model, you either want to have your worker thread call back to its creator (or to some other process) when it's finished its work, or you have to poll the worker thread every so often to see if it's done and, if so, get the result.
The idea of waiting for a worker thread to return its result undermines the benefits of multithreading.
You could have your thread raise an event with the object as an argument:
where:
Generally speaking when running a process async, The worker thread should call a delegate or fire an event (like ChrisF).
You can check out the new PFX which has some concurrency function that can return values.
For example there is a function called Parallel.ForEach() which has an overload that can return a value.
check this out for more info
http://msdn.microsoft.com/en-us/magazine/cc817396.aspx
RunWorkerAsync()
starts the process asynchronously and will return and continue executing your code before the process actually completes. If you want to obtain the result of theBackgroundWorker
, you'll need to create an instance variable to hold that value and check it once theBackgroundWorker
completes.If you want to wait until the work is finished, then you don't need a
BackgroundWorker
.In your
DoWork
event handler for theBackgroundWorker
(which is where the background work takes place) there is an argumentDoWorkEventArgs
. This object has a public property object Result. When your worker has generated its result (in your case, aList<FileInfo>
), sete.Result
to that, and return.Now that your BackgroundWorker has completed its task, it triggers the
RunWorkerCompleted
event, which has aRunWorkerCompletedEventArgs
object as an argument.RunWorkerCompletedEventArgs.Result
will contain the result from yourBackgroundWorker
.example: