Its relatively simple, you have to invoke the adding/removing/modifying of a control on the UI thread:
flowLayoutPanel1.Invoke((MethodInvoker) delegate {
});
You can construct the control outside of the invoke, and only put the add inside the invoke delegate. This is just one way of doing it, there are other ways. For example, before calling flowLayoutPanel1.Invoke you should check first if a cross-thread operation will really occur by checking the value of flowLayoutPanel1.InvokeRequired. If that is true, then do the above, if not, just add it directly to the panel.