<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
</Project>
using System;
using System.Threading;
using System.Threading.Tasks;
namespace HttpClientExample
{
class Program
{
// В качестве исключения я расположил в самом верху класса метод Main,
// обычно здесь должны быть поля класса, а все методы ниже.
#region Entry point
static async Task Main(string[] args)
{
var program = new Program();
await program.Run(args);
}
#endregion
private readonly SomeClient _client;
public Program()
{
_client = new SomeClient("http://localhost:5000");
}
private async Task Run(string[] args)
{
bool success = false;
do
{
try
{
// CancellationToken пригодится в приложениях с UI, где нужно, например,
// закрыть окно или уйти со страницы не дожидаясь, пока запрос отработает.
// Здесь заранее это заложено, можно и не использовать, если приложение консольное.
string data = await _client.GetData(CancellationToken.None);
success = true;
Console.WriteLine(data);
}
catch (ApiException ex)
{
// Одна реакция
Console.WriteLine(ex);
Console.WriteLine();
}
catch (Exception ex)
{
// Другая реакция
Console.WriteLine(ex);
Console.WriteLine();
}
await Task.Delay(150);
} while (!success);
_client.Dispose();
}
}
}
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace HttpClientExample
{
public class SomeClient : IDisposable
{
private const string GET_TEXT_PART = "/api/system/get-text";
private const string GET_USER_PART = "/api/system/get-user";
private HttpClient _httpClient;
public Dictionary<string, string> DefaultHeaders { get; }
public SomeClient(string baseAddress)
{
var httpHandler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
};
_httpClient = new HttpClient(httpHandler)
{
BaseAddress = new Uri(baseAddress)
};
DefaultHeaders = new Dictionary<string, string>
{
["Accept"] = "*/*",
["Accept-Encoding"] = "gzip, deflate",
["Cache-Control"] = "no-cache",
["Connection"] = "keep-alive",
};
}
public void Dispose()
{
if (_httpClient != null)
{
_httpClient.Dispose();
_httpClient = null;
GC.SuppressFinalize(this);
}
}
public async Task<string> GetData(CancellationToken cancellationToken)
{
string text = await InvokeText(HttpMethod.Get, GET_TEXT_PART, cancellationToken);
// Возможно, что-то залогировал.
return text;
}
public async Task<User> GetUser(CancellationToken cancellationToken)
{
var user = await InvokeJson<User>(HttpMethod.Get, GET_USER_PART, cancellationToken);
// Возможно, что-то залогировал.
return user;
}
/// <summary>
/// Sets the request.
/// </summary>
/// <param name="request">The request.</param>
/// <param name="requestContent">Content of the request.</param>
private void SetRequest(HttpRequestMessage request, object requestContent)
{
foreach (var header in DefaultHeaders)
{
request.Headers.Add(header.Key, header.Value);
}
if (requestContent != null)
{
request.Content = new StringContent(JsonConvert.SerializeObject(requestContent),
Encoding.UTF8,
Constants.HttpMimeTypes.JsonContentType);
}
}
/// <summary>
/// Invokes the specified HTTP method.
/// </summary>
/// <param name="httpMethod">The HTTP method.</param>
/// <param name="relativeUrl">The relative URL.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <param name="requestContent">Content of the request.</param>
/// <returns>instance of the type T</returns>
/// <exception cref="ApiException"></exception>
private async Task<string> InvokeText(HttpMethod httpMethod, string relativeUrl, CancellationToken cancellationToken, object requestContent = null)
{
using (var request = new HttpRequestMessage(httpMethod, relativeUrl))
{
SetRequest(request, requestContent);
using (HttpResponseMessage response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken))
{
string responseText = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
return responseText;
}
throw new ApiException(response.StatusCode, responseText);
}
}
}
/// <summary>
/// Invokes the specified HTTP method.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="httpMethod">The HTTP method.</param>
/// <param name="relativeUrl">The relative URL.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <param name="requestContent">Content of the request.</param>
/// <returns>instance of the type T</returns>
/// <exception cref="ApiException"></exception>
private async Task<T> InvokeJson<T>(HttpMethod httpMethod, string relativeUrl, CancellationToken cancellationToken, object requestContent = null)
{
using (var request = new HttpRequestMessage(httpMethod, relativeUrl))
{
SetRequest(request, requestContent);
using (HttpResponseMessage response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken))
{
string responseText = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
var resource = JsonConvert.DeserializeObject<T>(responseText);
return resource;
}
throw new ApiException(response.StatusCode, responseText);
}
}
}
private static class Constants
{
public static class HttpMimeTypes
{
/// <summary>
/// The json content type
/// </summary>
public const string JsonContentType = "application/json";
}
}
}
}
using Newtonsoft.Json;
namespace HttpClientExample
{
public class User
{
[JsonProperty("id", Required = Required.Always)]
public long Id { get; set; }
[JsonProperty("name", Required = Required.Always)]
public string Name { get; set; }
}
}
using System;
using System.Threading;
using System.Threading.Tasks;
namespace EventsInModel.Models
{
public class SearchAlgorithm
{
public string CurrentFolder { get; private set; }
public event EventHandler ProgressChanged;
public async Task Search(CancellationToken cancellationToken)
{
for (int i = 0; i < 5; i++)
{
await Task.Delay(1200, cancellationToken);
cancellationToken.ThrowIfCancellationRequested();
// Можно прогресс передавать и в качестве аргумента события,
// но в данном случае, вряд ли это оправдано. Обработав событие можно получить
// доступ к отправителю события и прочитать его свойства.
CurrentFolder = i.ToString();
ProgressChanged?.Invoke(this, EventArgs.Empty);
}
}
}
}
using System;
using System.Threading;
using System.Windows.Input;
using EventsInModel.Models;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
namespace EventsInModel.ViewModels
{
// ViewModelBase из библиотеки MvvmLight
public class MainViewModel : ViewModelBase
{
//private readonly object _sync = new object();
private readonly SearchAlgorithm _search;
private string _currentFolder;
// Логику с отменой можно вынести в отдельный класс, чтобы не писать простыню
// с отменой в каждом таком месте с операцией, которая может быть отменена, а
// в UI приложениях такое сплошь и рядом.
private volatile CancellationTokenSource _lastCancellationTokenSource;
public string CurrentFolder
{
get { return _currentFolder; }
private set { Set(ref _currentFolder, value); }
}
public ICommand SearchCommand { get; }
public MainViewModel(SearchAlgorithm search)
{
_search = search;
_search.ProgressChanged += OnSearchProgressChanged;
SearchCommand = new RelayCommand(Search);
}
public override void Cleanup()
{
//lock (_sync)
{
_lastCancellationTokenSource?.Cancel();
}
_search.ProgressChanged -= OnSearchProgressChanged;
base.Cleanup();
}
/// <summary>
/// Прерывает прошлый поиск и запускает новый.
/// </summary>
private async void Search()
{
CancellationTokenSource currentTokenSource;
// В случае, если такой метод вызывать не из UI потока, то lock здесь нужен
// Если использовать только из UI потока как здесь, то lock можно удалить.
// Ещё бы я вынес логику в отдельный класс и использовал в других проектах в том числе.
//lock (_sync)
{
_lastCancellationTokenSource?.Cancel();
currentTokenSource = new CancellationTokenSource();
_lastCancellationTokenSource = currentTokenSource;
}
try
{
await _search.Search(currentTokenSource.Token);
}
catch (OperationCanceledException)
{
// Ignored.
}
finally
{
//lock (_sync)
{
currentTokenSource.Dispose();
if (ReferenceEquals(_lastCancellationTokenSource, currentTokenSource))
{
_lastCancellationTokenSource = null;
}
}
}
}
private void OnSearchProgressChanged(object sender, EventArgs e)
{
var search = (SearchAlgorithm)sender;
CurrentFolder = search.CurrentFolder;
}
}
}
using System.Windows;
using EventsInModel.Models;
using EventsInModel.ViewModels;
namespace EventsInModel
{
public partial class MainWindow : Window
{
private readonly MainViewModel _viewModel;
public MainWindow()
{
InitializeComponent();
_viewModel = new MainViewModel(new SearchAlgorithm());
DataContext = _viewModel;
Loaded += OnLoaded;
Closing += OnClosing;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
_viewModel.SearchCommand.Execute(null);
_viewModel.SearchCommand.Execute(null);
}
private void OnClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
_viewModel.Cleanup();
}
}
}
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MvvmLightLibsStd10" Version="5.4.1.1" />
</ItemGroup>
</Project>
class BrightControl
public void setDefaultBright(Object obj){
obj.setBright(10);
}
}
Как мне в цикле получить все данные из DataTable?
for (int i = 0; i < dt.Rows.Count; i++)
{
foreach (var value in dt.Rows[i].Values)
{
//Console.WriteLine(value);
}
}
for (int i = 0; i < dt.Rows.Count; i++)
{
foreach (var kv in dt.Rows[i])
{
//Console.WriteLine("Column: " + kv.Key + ", value: " + kv.Value);
}
}
Address: 91.108.56.0 01011011.01101100.001110 00.00000000
Netmask: 255.255.252.0 = 22 11111111.11111111.111111 00.00000000
Wildcard: 0.0.3.255 00000000.00000000.000000 11.11111111
=>
Network: 91.108.56.0/22 01011011.01101100.001110 00.00000000
Address: 91.108.57.58 01011011.01101100.001110 01.00111010
Netmask: 255.255.252.0 = 22 11111111.11111111.111111 00.00000000
Wildcard: 0.0.3.255 00000000.00000000.000000 11.11111111
=>
Network: 91.108.56.0/22 01011011.01101100.001110 00.00000000
Network - совпадает, значит они в одной подсети.Address: 91.108.51.1 01011011.01101100.001100 11.00000001
Netmask: 255.255.252.0 = 22 11111111.11111111.111111 00.00000000
Wildcard: 0.0.3.255 00000000.00000000.000000 11.11111111
=>
Network: 91.108.48.0/22 01011011.01101100.001100 00.00000000
Тут сеть отличается. bd.User.OrderBy(x => x.Id).ElementAt(5);
bd.User.OrderBy(x => x.Id).ToList().FindIndex(x => x.Name == "Vasya");