views:

50

answers:

4

I am dealing with running a control in a form, however the form itself is of no value to me. I essentially want the form to run a task and return a value, however for that I'd like to use something like an AutoResetEvent to return from the function call only when it has completed, which obviously would block the forms thread and make it impossible for the task to complete.

+2  A: 

Why are you running tasks in a form?

This sounds like you have your UI and program logic tightly integrated. This is bad design.

In general, You can get data from a worker thread the standard way. Worker stores data in a thread safe data structure, then sends an event to the main thread signaling the data is available.

Byron Whitlock
For web scraping purposes.
Novikov
+2  A: 

I've got two ideas in my mind:

  1. Run delegate method

    IAsyncResult ar = del.BeginInvoke(callback, state);

    ... do the task

    EndInvoke(ar); // waiting for task result if you allow to wait

  2. Separate thread

The best way may be use separate thread to do the task and call delegate in this thread to inform main thread about work finish.

edit: or Worker like suggest my predecessor

UGEEN
+2  A: 

I think the simplest solution is to just raise an event from the form once the task has completed.

void RunTask()
{
    Form form = new Form();
    form.TaskCompleted += new EventHandler(form_TaskCompleted);
    form.Show();
}

void form_TaskCompleted(object sender, EventArgs e)
{
    object result = ((Form)sender).GetResult();
}

Edit: Of course you'd want to dispose the form and unhook that event once it's completed etc..

Fara
+1  A: 

I did this once for my project

    System.Threading.Thread newThread;
    Form1 frmNewForm = new Form1;

   newThread = new System.Threading.Thread(new System.Threading.ThreadStart(frmNewFormThread));

        newThread.SetApartmentState(System.Threading.ApartmentState.STA);
        newThread.Start();

And add the following Method. Your newThread.Start will call this method.

    public void frmNewFormThread)()
    {

        Application.Run(frmNewForm);

    }
franklins