Novikov
Novikov

Reputation: 4489

Running a windows form in a separate thread

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.

Upvotes: 2

Views: 7086

Answers (4)

franklins
franklins

Reputation: 3748

I did this once for my project

var frmNewForm = new Form1();
var newThread = new System.Threading.Thread(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);
}

Upvotes: 11

Alex McBride
Alex McBride

Reputation: 7021

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..

Upvotes: 2

Przemysław Michalski
Przemysław Michalski

Reputation: 9867

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

Upvotes: 2

Byron Whitlock
Byron Whitlock

Reputation: 53921

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.

Upvotes: 2

Related Questions