当IProgress<T>
用于报告进度时,它应该是
IProgress<T>
要意识到进展报告的频率可能高于其提出这一进展的方式.问题的背景是我有一些IProgress<T>
用于报告进度的代码,它以非常高的速度报告进展情况.我想用UI进度条显示进度.如果我使用提供的Progress<T>
实现(将进度发布到UI SyncronizationContext),那么它会导致UI无响应(即,有很多消息发送到消息队列,用户甚至无法单击"取消"按钮在对话框上).
所以,
IProgress<T>
实现只是将进度写入日志文件(并且可以处理高报告频率),那该怎么办呢?-要么-IProgress<T>
实现来解决这个问题,该实现限制了我处理/报告进度的频率.据推测,此实现将记录非UI线程的最新进度,然后(可能)UI将基于计时器进行更新.由于 WebClient 在 .NET 6 中已弃用,因此我想使用 WebClient 将以下代码转换为使用 HttpClient 调用 REST Web API 的等效代码:
using WebClient client = new();
client.Encoding = Encoding.UTF8;
client.Headers.Set(HttpRequestHeader.ContentType, "application/json");
client.Headers.Add("user_key", tokens[0]);
client.Headers.Add("Session_key", tokens[1]);
string json = JsonSerializer.Serialize(sms);
string serverResponse = client.UploadString(_baseUrl + "sms", "POST", json);
Run Code Online (Sandbox Code Playgroud)
目前,我实施了以下解决方案:
HttpClient httpClient = _httpClientFactory.CreateClient();
HttpRequestMessage request = new(HttpMethod.Post, _baseUrl + "sms");
request.Headers.Add("user_key", tokens[0]);
request.Headers.Add("Session_key", tokens[1]);
string json = JsonSerializer.Serialize(sms);
request.Content = new StringContent(json, Encoding.UTF8, MediaTypeNames.Application.Json);
using HttpResponseMessage response = await httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
Run Code Online (Sandbox Code Playgroud)
我认为上述解决方案是替换原始代码的最干净、最有效的方法。有专家可以证实一下吗?
我正在编写一个图书馆,意图在桌面(.Net 4.0及更高版本),手机(WP 7.5及以上版本)和Windows Store(Windows 8及更高版本)应用程序中使用它.
该库能够使用Portable HttpClient库从Internet下载文件,并报告下载进度.
我在这里和互联网的其余部分搜索有关如何实施进度报告的文档和代码示例/指南,这次搜索使我无处可去.
有没有人有文章,文档,指南,代码示例或其他什么来帮助我实现这一目标?
我想在WPF中使用进度条运行异步上传(最好使用PCL在Xamarin和SL中重用代码.)
我一直在尝试使用System.Net.HttpClient.不幸的是,PutAsync不提供任何进度通知.(我知道它适用于Windows.Web.Http.HttpClient,但这不适用于WPF,也不适用于PCL).
对于下载,它非常容易实现自己的进度条,如所描述这里.您只需传递ResponseHeadersRead选项,该选项会在返回标题后立即使用该流,然后您可以在块中按块读取它,随时增加进度条.但是对于上传,这种技术不起作用 - 您需要一次性将所有上传数据传递给PutAsync,因此没有机会增加您的计数器.
我也想知道如何使用HttpClient.SendAsync.我所希望我可以把这个像一个异步HttpWebRequest的(其中如你所描述的写入HttpWebRequest.GetRequestStream可以增加计数器在这里).但不幸的是HttpClient.SendAsync不会给你可写的流,所以这不起作用.
那么HttpClient是否支持使用非阻止UI和进度条上传?这似乎是一个适度的需求.还是我应该使用另一个班级?非常感谢.
wpf upload portable-class-library progress-bar dotnet-httpclient
有没有办法获取ReadAsStringAsync()
方法的进度?我只是获取网站的 HTML 内容并进行解析。
public static async Task<returnType> GetStartup(string url = "http://")
{
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("User-Agent",
"Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko");
using (HttpResponseMessage response = await client.GetAsync(url))
{
using (HttpContent content = response.Content)
{
string result = await content.ReadAsStringAsync();
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我对C#和编码很新,所以其中一些可能是错误的方式.我编写的程序按预期工作并压缩文件,但如果源代码很大,程序会出现(对Windows)挂起.我觉得我应该使用a Thread
但我不确定这会有所帮助.
我会使用进度条,但是用于zipfile的'new'(.net 4.5)库System.IO.Compression
,替换后
Ionic.Zip.ZipFile
没有报告进度的方法?有没有解决的办法?我应该使用Thread
吗?还是DoWork
?
问题是用户和系统没有得到关于程序正在做什么的反馈.
我不确定我是以正确的方式提出这个问题.下面是正在运行的代码,但同样会出现挂起系统的问题.
private void beginBackup_Click(object sender, EventArgs e)
{
try
{
long timeTicks = DateTime.Now.Ticks;
string zipName = "bak" + timeTicks + ".zip";
MessageBox.Show("This Will take a bit, there is no status bar :(");
ZipFile.CreateFromDirectory(Properties.Settings.Default.source,
Properties.Settings.Default.destination + "\\" + zipName);
MessageBox.Show("Done!");
this.Close();
}
catch (IOException err)
{
MessageBox.Show("Something went wrong" + System.Environment.NewLine
+ "IOException source: {0}", err.Source);
}
}
Run Code Online (Sandbox Code Playgroud)
重要的是:
`ZipFile.CreateFromDirectory(Properties.Settings.Default.source,
Properties.Settings.Default.destination + "\\" + zipName);`
Run Code Online (Sandbox Code Playgroud)
编辑 …
我有一个控制台程序,它向外部 Web API 发送异步 HTTP 请求。( HttpClient.GetAsync());
)
这些任务可能需要几分钟才能完成——在此期间,我希望能够向用户显示应用程序仍在运行——例如Console.WriteLine("I ain't dead - yet")
每 10 秒发送一次。
我不知道如何正确地做到这一点,而不会有隐藏异常、引入死锁等的风险。
我知道 IProgress<T>,但是我不知道我是否可以在这种情况下引入它。我正在等待一个不报告进度的异步调用。(它本质上是一个调用 httpClient GetAsync() 方法的 SDK
另外:我无法将 GUI 设置为“InProgress”,因为没有 GUI,它是一个控制台应用程序 - 如果我不时不时地发送更新消息,它在用户看来似乎停止工作。
目前的想法:
try
{
var task = httpClient.GetAsync(uri); //actually this is an SDK method call (which I cannot control and which does not report progress itself)
while (!task.IsCompleted)
{
await Task.Delay(1000 * 10);
this.Logger.Log(Verbosity.Verbose, "Waiting for reply...");
}
onSuccessCallback(task.Result);
}
catch (Exception ex)
{
if (onErrorCallback == null)
{
throw this.Logger.Error(this.GetProperException(ex, …
Run Code Online (Sandbox Code Playgroud) c# ×6
async-await ×3
asynchronous ×2
progress ×2
.net-6.0 ×1
api ×1
httpclient ×1
progress-bar ×1
stream ×1
upload ×1
wpf ×1
zipfile ×1