私はTCP/IP接続を使用するゲームを作成しています。問題は、私がメッセージを受信して送るのを助けるために.Invokeを使用していることです。.CreateHandler()を使用するとC#ハンドラが作成されず失敗する
プログラムはこのように書き:私は私の最初のウィンドウよ、私は開始し、このようなサーバに接続しています:
{
TcpListener listener = new TcpListener(IPAddress.Any, this.port);
listener.Start();
try {
this.client = listener.AcceptTcpClient();
gameWindow = new GameWindow(this.client, true);
gameWindow.StartGame();
}
}
は、私はこのようにそれに接続しています:
{
IPEndPoint ipEnd = new IPEndPoint(this.serverIP, this.port);
{
try {
client.Connect(ipEnd);
if (client.Connected) {
gameWindow = new GameWindow(this.client, false);
gameWindow.StartGame();
}
}
}
(フォームで)gameWindow
のコンストラクタは次のようになります。
public GameWindow(TcpClient thisClient, bool isServer)
{
InitializeComponent();
this.client = thisClient;
this.reader = new StreamReader(thisClient.GetStream());
this.writer = new StreamWriter(thisClient.GetStream());
this.writer.AutoFlush = true;
}
私はワイ必要がありますサーバがクライアントにメッセージを送信し、クライアントを起動するためのトン(私は.ShowDialog()
を使用し、いくつかのpictureBox
Sを作成する機能.startGame()
を持っている)
しかし、どこにも、私は私のハンドルが作成されません得ることができます。私はGameWindow_Load
にthis.createHandle()
(ここでそれについて読む)を入れようとしましたが、まだ動作しません。私がメッセージを送信しようとした場合: workerSendData.RunWorkerAsync();
私が取得:
Additional information: Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
私は私のhandler
が作成されますし何ができますか?データを受信するための
private void workerSendData_DoWork(object sender, DoWorkEventArgs e)
{
if (client.Connected) {
this.writer.WriteLine(this.toSend); // aici trimitem datele.
// de modificat : aici vom adauga in lista noastra miscarile.
this.Invoke(new MethodInvoker(delegate() { MessageBox.Show("Me:" + this.toSend + "\n"); }));
}
else {
MessageBox.Show("Send failed");
}
workerSendData.CancelAsync();
}
マイコード:
メッセージを送信するためのThread.Sleep
動作しません私の全体のUI、(インターネット上で見つかった「ソリューション」)をスリープします
私のコードを使用して
private void workerReceiveData_DoWork(object sender, DoWorkEventArgs e)
{
while (client.Connected) {
try {
this.received = this.reader.ReadLine();
this.myTurn = true;
this.Invoke(new MethodInvoker(delegate() {
MessageBox.Show("This has been received: " + this.received);
/*this.tbReceive.AppendText("You:" + this.received + "\n");*/
}));
this.received = "";
}
catch (Exception x) {
MessageBox.Show(x.Message.ToString());
}
}
}
'Load'イベントの中でハンドルは既に作成されています。あなたのクラスを外部からインスタンス化した後に、 'CreateHandle'メソッドを使用してください。 – abto