Поэтому мне нужен индикатор выполнения в моем приложении, и я скопировал пример с открытым исходным кодом Microsoft (извините, не извините), и он работает потрясающе, за исключением случаев, когда вам нужно включить данные POST (или я просто идиот и не могу понять это).
Рабочий код:
const uint streamLength = 100000;
HttpStreamContent streamContent = new HttpStreamContent(new SlowInputStream(streamLength));
IProgress<HttpProgress> progress = new Progress<HttpProgress>(ProgressHandler);
response = await httpClient.PostAsync(new Uri(settings.url + "/script.php"), streamContent).AsTask(cts.Token, progress);
Это дает мне прогресс и все, теперь мне нужно добавить 4 значения поста, прежде чем они были в словаре следующим образом:
var values = new Dictionary<string, string>
{
{ "1", "1" },
{ "2", "2" },
{ "3", "3" },
{ "4", "4" }
};
Затем я закодировал их
HttpFormUrlEncodedContent formContent = new HttpFormUrlEncodedContent(values);
Как я получу свой formContent (или если вы хотите сделать это другим способом, который тоже работает) в streamContent, потому что без streamContent выглядит так, что прогресс не работает.
Изменить 1:
Итак, это работает, теперь прогресс больше не работает. Вот моя функция прогресса
private void ProgressHandler(HttpProgress progress)
{
Debug.WriteLine("Stage: " + progress.Stage.ToString());
Debug.WriteLine("Retires: " + progress.Retries.ToString(CultureInfo.InvariantCulture));
Debug.WriteLine("Bytes Sent: " + progress.BytesSent.ToString(CultureInfo.InvariantCulture));
Debug.WriteLine("Bytes Received: " + progress.BytesReceived.ToString(CultureInfo.InvariantCulture));
ulong totalBytesToSend = 0;
if (progress.TotalBytesToSend.HasValue)
{
totalBytesToSend = progress.TotalBytesToSend.Value;
Debug.WriteLine("Total Bytes To Send: " + totalBytesToSend.ToString(CultureInfo.InvariantCulture));
}
else
{
Debug.WriteLine("Total Bytes To Send: " + "unknown");
}
ulong totalBytesToReceive = 0;
if (progress.TotalBytesToReceive.HasValue)
{
totalBytesToReceive = progress.TotalBytesToReceive.Value;
Debug.WriteLine("Total Bytes To Receive: " + totalBytesToReceive.ToString(CultureInfo.InvariantCulture));
}
else
{
Debug.WriteLine("Total Bytes To Receive: " + "unknown");
}
double requestProgress = 0;
if (progress.Stage == HttpProgressStage.SendingContent && totalBytesToSend > 0)
{
requestProgress = progress.BytesSent * 50 / totalBytesToSend;
}
else if (progress.Stage == HttpProgressStage.ReceivingContent)
{
// Start with 50 percent, request content was already sent.
requestProgress += 50;
if (totalBytesToReceive > 0)
{
requestProgress += progress.BytesReceived * 50 / totalBytesToReceive;
}
}
else
{
return;
}
Debug.WriteLine("Progress: " + requestProgress);
snap_progress.Value = requestProgress;
}
И вот что он показывает в отладке:
Stage: ReceivingContent
Retires: 0
Bytes Sent: 180
Bytes Received: 6757607
Total Bytes To Send: 180
Total Bytes To Receive: unknown
Progress: 50
Это неизвестно все время, хотя я вижу увеличение числа полученных байтов.
Так что мой ответ почти нулевой, мне просто нужно было указать Content-Length в моем php-скрипте, чтобы код получал размер, он отображал неизвестное значение. Я до сих пор не знаю, как он получил это раньше.
Других решений пока нет …