Подскажите, возможно ли обойтись без асинхронных операций await/async
в коде, для загрузки файла?
Для загрузки файла используется ресурс: https://anonfile.com/docs/api
Для работы с API ресурс предоставляет код:
curl -F "file=@test.txt" https://anonfile.com/?token=s245v7ebt3sn7kf5
Код curl
конвертировал в C#
на сервисе: https://curl.olsh.me/
Получил результат:
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://anonfile.com/?token=s245v7ebt3sn7kf5"))
{
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(new ByteArrayContent(File.ReadAllBytes("test.txt")), "file", Path.GetFileName("test.txt"));
request.Content = multipartContent;
var response = await httpClient.SendAsync(request);
}
}
Проблема в коде последняя строчка:
var response = await httpClient.SendAsync(request);
Когда я вставляю данный код в кнопку, приходится добавлять async
и использовать версию NetFramework 4.5+
private async void button1_Click(object sender, EventArgs e)
Есть ли возможность избавиться от await/async
, чтобы файл загрузился другим способом?
Держи хэлпер, помогающий безболезненно отреагировать на ответ
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void OnButtonClick(object sender, EventArgs e)
{
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"),
"https://anonfile.com/?token=s245v7ebt3sn7kf5"))
{
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(
new ByteArrayContent(File.ReadAllBytes("test.txt")), "file",
Path.GetFileName("test.txt"));
request.Content = multipartContent;
Helper.Send(request, task =>
{
if (task.Status == TaskStatus.RanToCompletion)
{
SetResult(task.Result.ToString());
}
else
{
SetResult("Что-то пошло не так");
}
}, httpClient);
}
}
}
private void SetResult(string text)
{
if (InvokeRequired)
{
Invoke(new Action(() => { SetResult(text); }));
}
else
{
Text = text;
}
}
}
public static class Helper
{
public static void Send(HttpRequestMessage request, Action<Task<HttpResponseMessage>> continueAction, HttpClient httpClient)
{
SendRequest(request, continueAction, httpClient);
}
private static void SendRequest(HttpRequestMessage request, Action<Task<HttpResponseMessage>> continueAction, HttpClient httpClient)
{
var task = httpClient.SendAsync(request);
task.GetAwaiter().OnCompleted(() =>
{
continueAction(task);
});
}
}
}
Можно как-то так обработать ответ асинхронно, чтобы не зависало окно.
private void OnButtonClick(object sender, EventArgs e)
{
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(
new HttpMethod("POST"), "https://someserver.com/?token=s123"))
{
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(new ByteArrayContent(
File.ReadAllBytes("test.txt")), "file", Path.GetFileName("test.txt"));
request.Content = multipartContent;
httpClient.SendAsync(request).ContinueWith(task =>
{
if (task.Status == TaskStatus.RanToCompletion)
{
//continuation(task.Result);
}
else
{
// ...
//continuation(null);
}
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как программно можно найти дочерние элементы Label по их Content внутри Canvas и удалить их ? Создаются динамически и по ненадобности нужно удалять...
Вылетает:
Помогите, пожалуйста, с решением проблемы element is not attached to the page documentРешил сделать програму по продаже карточек в Steam