0

ftpサーバーからxml(最大500kb)ファイルをダウンロードしてアップロードするプログラムを作っています。アップロード画面を作る必要があります。3つの方法を試しました。最初の方法では、画像ボックスに入れたロード画面を示す .gif ファイルを使用しました。その後、アップ/ダウンロード機能を処理する前に画像ボックスを表示し、機能が終了したら非表示にします。しかし、うまくいきませんでした:(コードは次のとおりです。

private void button2_Click(object sender, EventArgs e)//upload button
{

    picturebox1.visible=true;  //.gif file
    upload();
    picturebox1.visible=false;
}

アップロード機能は次のとおりです。

void upload()
{
    FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("ftp://" + IP + ":" +                  Port + downdest + xmlfile);

    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.Credentials = new NetworkCredential(username, password);
    request.UsePassive = true;
    request.UseBinary = true;
    request.KeepAlive = false;

    //Load the file
    FileStream stream = File.OpenRead("apartman.xml");
    byte[] buffer = new byte[stream.Length];

    stream.Read(buffer, 0, buffer.Length);
    stream.Close();

    //Upload file
    Stream reqStream = request.GetRequestStream();
    reqStream.Write(buffer, 0, buffer.Length);
    reqStream.Close();
}

このコードを使用すると、アップロードは機能しますが、画像は表示されません。アップロード コードが機能していない場合、ロード画面も表示されません。

次に、マルチスレッド化を試みましたが、c# では、このコードを別のスレッドで使用することはできません。

picturebox1.visible=true;

「これをブラブラと呼ぶことはできません...」のようなものです。私は覚えていないし、コードも消去したので、情報が不足していて申し訳ありません。

最後に、backgroundworker を使用してみました。コードは次のとおりです。

public Form1()
{
    CheckForIllegalCrossThreadCalls = false;
    InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)//upload button
{
    backgroundWorker1.RunWorkerAsync();
}


private void upload()
{
    backgroundWorker1.ReportProgress(i);
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    //upload
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    MessageBox.Show("upload complete");
}

このコードでは、次のようなエラー メッセージも表示されます。

エラー 1 ファイルに無効な値 ""updates":" があります。path.xml2 の不正な文字

ロード画面をプログラミングする正しい方法を知っている人はいますか?
詳細が必要な場合は、ご質問に確実にお答えします。

4

1 に答える 1

1

最初のスニペットの問題は、UI スレッドが読み込み中の画像のステータスを変更するのに十分な時間がないことです。可視性を変更して画像を表示すると、すぐにアップロード プロセスが開始され、UI スレッドがブロックされます。変更が有効にならないようにします。つまり、読み込み中の画像を表示します。

アップロードが完了したら、すぐに画像を非表示にします。その瞬間、UI スレッドは画像を表示しようとし (保留中の変更を有効にする)、その後すぐに画像を非表示にします。

この動作を修正するには、アップロード プロセスを別のスレッドに移動する必要があります。あなたがやろうとしましたが、それを機能させることに成功しませんでした。

.NET のバージョンに応じて、これを行う方法は多数あります。バックグラウンドワーカーは優れたものであり、おそらく最善の策です. スレッド コンテキスト内から UI を更新する場合は常に、ディスパッチャを使用して更新していることを確認してください。

Dispatcher dispUI = Dispatcher.CurrentDispatcher;
dispUI.BeginInvoke(new Action(() => {
            //From here you can safely 
            //hide your loading image
        }), null
            );
于 2013-08-23T09:43:14.963 に答える