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.
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.
I've got two ideas in my mind:
Run delegate method
IAsyncResult ar = del.BeginInvoke(callback, state);
... do the task
EndInvoke(ar);
// waiting for task result if you allow to waitSeparate 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
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..
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);
}