0

スレッドを使用して UI を更新する winform アプリケーションに問題があります。私のアプリケーションは、クラウドからのファイルのアップロードとダウンロードを行います。同時に、同じウィンドウにネットワーク速度の詳細も表示しています。これら 3 つの操作 (アップロード、ダウンロード、n/w 速度の表示) は、3 つの異なるスレッドによって呼び出されます。問題は、ダウンロード/アップロードを開始すると、ウィンドウ全体がフリーズし、n/w 速度表示が更新されないことです (1 秒間隔ごとに更新するように記述されています)。何が問題になるでしょうか?前もって感謝します。

コードは次のとおりです...ダウンロード用に書いたのと同じ方法です。最初に **Upload** を呼び出し、次に **Download** を順番に呼び出すと、最初のスレッドが一時停止し、ダウンロード スレッドが開始されます。**ダウンロード**が完了すると、**アップロード**が続行されます。それは並行して進んでいません。また、UI は、他のボタンのクリックやウィンドウのサイズ変更、移動アクションに対してすぐに応答しません。

public delegate void UploadDelgt();
UploadDelgt UpldDlgtObj;
 private void Form1_Load(object sender, EventArgs e)
{
    UpldDlgtObj = new UploadDelgt(DoUpload);
}

public void load()
{
    Form1 form = this;
    form.Invoke(UpldDlgtObj);
}

private void button1_Click(object sender, EventArgs e)
{
    thrd = new Thread(new ThreadStart(load));
    thrd.Start();
    thrd.IsBackground = true;
}

public void DoUpload()
{
//uploads file block by block and updates the progressbar accordingly..
}
4

2 に答える 2

2

これら 3 つの操作 (アップロード、ダウンロード、n/w 速度の表示) は、3 つの異なるスレッドによって呼び出されます。問題は、ダウンロード/アップロードを開始すると、ウィンドウ全体がフリーズすることです

ワーカー スレッドの 1 つが UI スレッドをブロックしています。これらの操作が UI スレッドで行われていないことと、ここで説明されているようにInvokeRequired/を使用していることを確認してくださいInvoke: http://www.codeproject.com/Articles/37642/Avoiding-InvokeRequired

于 2012-04-04T10:15:49.693 に答える
1

メソッドを呼び出しているため、UI がフリーズform.InvokeしますloadMSDNからInvoke:別のスレッドでExecutes the specified delegate on the thread that owns the control's underlying window handle. 呼び出していると思っても、.DoUploadInvoke

于 2012-04-05T12:16:58.927 に答える