Can't edit GUI from another thread

So I’m working on my own network class using .net sockets but I can’t send an error message to the main menu when the socket couldn’t connect.

Here is the main menu code to set the error message:

	public void showMessage(string str){
			GUIStyle style = new GUIStyle();
			style.normal.textColor = Color.red;
			GUI.Label(new Rect((Screen.width /2) - 100, (Screen.height / 2) - 140, 200, 25), str, style);
	}

Which is called from the network class…

		try{
			Socket sock = (Socket) ar.AsyncState;
			sock.EndConnect(ar);
			buffer = new byte[sock.ReceiveBufferSize];
			sock.BeginReceive(buffer, 0, sock.ReceiveBufferSize, 0 , new AsyncCallback(ReadCallBack), sock);
		
		}catch{
			mainMenu.showMessage("Couldn't reach Server");
		}

and the network class is defined from the main menu as an entirely new class from onGUI…

		network net = new network(new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp), this);

But I get this error:

GetStyleStatePtr can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don’t use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.

I get the error but I don’t know how to fix it. Any help?

You cannot call GUI functions directly from any function you like. Instead, you should call them from within OnGUI

so change your showMessage to remember the message to be displayed and add a OnGUI function to your main menu that displays the message then.

string message;
public void showMessage(string str){
    this.message = str;
}
void OnGUI()
{
    GUIStyle style = new GUIStyle();
    style.normal.textColor = Color.red;
    GUI.Label(new Rect((Screen.width /2) - 100, (Screen.height / 2) - 140, 200, 25), message, style);
}