in winform application,i want use single backgroundworker (or may 1 each form) different tasks on different events. eg: search, loading data in grid, opening new forms, sending emails, file transfer etc. how can manage in backgroundworker_dowork() , backgroundworker_runworkercompleted() events? what optimum way/ best practice this? usually, end caling worker parameter, this: backgroundworker.runworkerasync(<some argument here>); then inside dowork method, can retrieve argument e.argument , , according argument is, know want it. if don't need argument else, can make enum values need, search , load , forth , pass in, , check value inside dowork choose want do. remember have cast enum inside dowork since e.argument object. regarding runworkercompleted, can populate e.result value inside dowork, , retrieve inside runworkercompleted method well. this best way of doing it, , thread safe way.