5

WPFアプリケーションにファイルをアップロードしようとしています。サーバーが応答すればすべて正常に動作しますが、アプリケーションは「安全でない」インターネット接続のある環境で使用されます。そのため、最初の試行が失敗した場合は、少し休憩してからアップロードを再試行します。

私はasync/awaitでいくつかのことを試しましたが、次のコードになりました。サーバーが実行されている場合はすべて問題ありませんが、実行されていない場合、プログラムはwhileループの2回目の反復でObjectDisposedExceptionで失敗します。

何か案は?

private void UploadButton_Click(object sender, RoutedEventArgs e)
{
    // build content to send
    content = new MultipartFormDataContent();
    var filestream = new FileStream(filePath, FileMode.Open);
    var fileName = System.IO.Path.GetFileName(filePath);
    content.Add(new StreamContent(filestream), "file", fileName);
    content.Add(new StringContent(terminal_id.ToString()), "terminal_id");

    UploadTask(content);
    /*var task_a = new Task(() => UploadTask(content));
    task_a.Start();*/
}

private async void UploadTask(HttpContent content)
{
    bool success = false;
    int counter = 0;

    while (counter < 3 && !success)
    {
        Debug.WriteLine("starting upload");
        success = await UploadFileAsync(content);
        Debug.WriteLine("finished upload. result " + success.ToString());
        //if (!success) System.Threading.Thread.Sleep(5000);
        counter++;
    }
}

private async Task<bool> UploadFileAsync(HttpContent content)
{
    var message = new HttpRequestMessage();
    message.Method = HttpMethod.Post;
    message.Content = content;
    message.RequestUri = new Uri(target_url);

    using (HttpClient client = new HttpClient())
    {
        try
        {
            HttpResponseMessage res = await client.SendAsync(message);
            if (res.IsSuccessStatusCode) return true;
        }
        catch (HttpRequestException hre)
        {
            Debug.WriteLine(hre.ToString());
        }
        return false;
    }
}
4

3 に答える 3

1

content問題は、範囲外になっていることだと思いますか?メソッドcontent内で作成してみてください。また、からを返し、それをクラスレベルの変数としてキャッシュすることは UploadTask価値があるかもしれません(したがって、voidを返す必要はありません)。Task<bool>UploadTask

例えば:

Task<bool> newTask;

private void UploadButton_Click(object sender, RoutedEventArgs e)
{
    newTask = UploadTask();

}

private async Task<bool> UploadTask()
{
bool success = false;
int counter = 0;

// build content to send
HttpContent content = new MultipartFormDataContent();
var filestream = new FileStream(filePath, FileMode.Open);
var fileName = System.IO.Path.GetFileName(filePath);
content.Add(new StreamContent(filestream), "file", fileName);
content.Add(new StringContent(terminal_id.ToString()), "terminal_id");

while (counter < 3 && !success)
{
    Debug.WriteLine("starting upload");
    success = await UploadFileAsync(content);
    Debug.WriteLine("finished upload. result " + success.ToString());

    counter++;
}

return success;
}
于 2013-01-29T09:34:59.937 に答える
1

ファイルストリームが破棄/クローズされたようです。最初から再試行する必要があります(content = new MultipartFormDataContent();など)。

于 2013-01-29T09:48:27.623 に答える
1

コンテンツの作成をUploadFileAsync()に移動した後、それは機能します。結果:

Task<bool> newTask;

private void UploadButton_Click(object sender, RoutedEventArgs e)
{
    newTask = UploadTask();
}

private async Task<bool> UploadTask()
{
    bool success = false;
    int counter = 0;

    while (counter < 3 && !success)
    {
        Debug.WriteLine("starting upload");
        success = await UploadFileAsync();
        Debug.WriteLine("finished upload. result " + success.ToString());
        if (!success) System.Threading.Thread.Sleep(5000);
        counter++;
    }
    return success;
}

private async Task<bool> UploadFileAsync()
{
    MultipartFormDataContent content = new MultipartFormDataContent();
    var filestream = new FileStream(filePath, FileMode.Open);
    var fileName = System.IO.Path.GetFileName(filePath);
    content.Add(new StreamContent(filestream), "file", fileName);
    content.Add(new StringContent(terminal_id.ToString()), "terminal_id");

    var message = new HttpRequestMessage();
    message.Method = HttpMethod.Post;
    message.Content = content;
    message.RequestUri = new Uri(target_url);

    using (HttpClient client = new HttpClient())
    {
        try
        {
            HttpResponseMessage res = await client.SendAsync(message);
            if (res.IsSuccessStatusCode) return true;
        }
        catch (HttpRequestException hre)
        {
            Debug.WriteLine(hre.ToString());
        }
        return false;
    }
}
于 2013-01-29T10:10:21.427 に答える