using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
// Чтение JSON из файла и десериализация.
string pathToFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "PartnerData.json");
string jsonText = File.ReadAllText(pathToFile, Encoding.UTF8);
var parterAddressesFromFile = JsonSerializer.Deserialize<TriggerData>(jsonText);
// Вывод на консоль.
Display(parterAddressesFromFile);
// Создание нового экземпляра класса TriggerData и его заполнение данными.
var data = new TriggerData()
{
PartnerAddresses = new List<PartnerAddress>()
{
new PartnerAddress()
{
Type = "Тип 0001",
Country = "Страна 0001",
Region = "Регион 0001",
City = "Город 0001",
Presentation = "Представление 0001",
},
new PartnerAddress()
{
Type = "Тип 0002",
Country = "Страна 0002",
Region = "Регион 00021",
City = "Город 0002",
Presentation = "Представление 0002",
}
}
};
// Сериализация.
var options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.Cyrillic),
WriteIndented = true,
};
var newJsonText = JsonSerializer.Serialize(data, options);
// Вывод на консоль.
Console.WriteLine(newJsonText);
}
private static void Display(TriggerData data)
{
// Способ 1.
foreach (var address in data.PartnerAddresses)
{
// Внутри Console.WriteLine будет вызван метод ToString для
// экземпляра класса PartnerAddress, у которого этот метод переопределён.
// https://source.dot.net/#System.Private.CoreLib/TextWriter.cs,09da57c2c21a3a44
Console.WriteLine(address);
}
// Способ 2.
//for (int i = 0; i < data.PartnerAddresses.Count; i++)
//{
// Console.WriteLine(data.PartnerAddresses[i]);
//}
}
}
}
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace ConsoleApp
{
public class TriggerData
{
[JsonPropertyName("партнерАдреса")]
public List<PartnerAddress> PartnerAddresses { get; set; }
}
}
using System.Text.Json.Serialization;
namespace ConsoleApp
{
public class PartnerAddress
{
[JsonPropertyName("тип")]
public string Type { get; set; }
[JsonPropertyName("страна")]
public string Country { get; set; }
[JsonPropertyName("регион")]
public string Region { get; set; }
[JsonPropertyName("город")]
public string City { get; set; }
[JsonPropertyName("представление")]
public string Presentation { get; set; }
public override string ToString()
{
return $"{Type}, {Country}, {Region}, {City}, {Presentation}";
}
}
}
{
"партнерАдреса": [
{
"тип": "тип1",
"страна": "страна1",
"регион": "регион1",
"город": "город1",
"представление": "представление1"
},
{
"тип": "тип2",
"страна": "страна2",
"регион": "регион2",
"город": "город2",
"представление": "представление2"
},
{
"тип": "null",
"страна": "null",
"регион": "null",
"город": "null",
"представление": "null"
},
{
"тип": "тип3",
"страна": "страна3",
"регион": "регион3",
"город": "город3",
"представление": "представление3"
}
]
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5</TargetFramework>
</PropertyGroup>
<ItemGroup>
<None Update="PartnerData.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ConsoleApp
{
class Program
{
static async Task Main(string[] args)
{
try
{
// Создаём экземпляр класса
var scanner = new Scanner();
// Вызываем асинхронный метод Scan, метод работает
// какое-то время, возвращает результат.
var data = await scanner.Scan();
foreach (var item in data)
{
// Выводим на консоль.
Console.WriteLine(item);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
public class Scanner
{
public Task<List<string>> Scan()
{
return Task.Run(async () =>
{
var results = new List<string>();
for (int i = 0; i < 10; i++)
{
// Делаем правильную задержку (имитация долгой работы для примера).
await Task.Delay(250);
// Собираем данные
results.Add(DateTimeOffset.Now.ToLocalTime().ToString());
}
return results;
});
}
public async Task<List<string>> ScanVersion2()
{
return await Task.Factory.StartNew(async () =>
{
var results = new List<string>();
for (int i = 0; i < 10; i++)
{
// Делаем правильную задержку (имитация долгой работы для примера).
await Task.Delay(250);
// Собираем данные
results.Add(DateTimeOffset.Now.ToLocalTime().ToString());
}
return results;
}, TaskCreationOptions.LongRunning)
.Unwrap() // Без этого возвращается Task<List<string>>, а не List<string>
.ConfigureAwait(false);
}
}
}
dotnet new classlib -n "LibraryName" -lang "C#" -o "D:\Projects\LibraryName"
using System;
using System.Windows.Forms;
namespace WinFormsApp
{
public partial class MainForm : Form
{
private readonly Random _random;
private readonly Timer _timer;
public MainForm()
{
InitializeComponent();
_random = new Random();
_timer = new Timer();
_timer.Interval = 500;
_timer.Tick += OnTimerTick;
}
private void OnFormLoad(object sender, EventArgs e)
{
_timer.Start();
}
private void OnTimerTick(object sender, EventArgs e)
{
label.Text = _random.Next(0, 1000).ToString();
}
}
}
private readonly string url = "https://kad.arbitr.ru/Card?number=";
private void OnWebBrowserFrameLoadEnded(object sender, FrameLoadEndEventArgs e)
{
Debug.WriteLine($"{nameof(OnWebBrowserFrameLoadEnded)}. " +
$"Frame.IsMain: {e.Frame.IsMain.ToString()}; e.Url: {e.Url};");
if (e.Frame.IsMain && e.Url.Contains(url))
{
Invoke((MethodInvoker)(async () =>
{
await UpdateData();
}));
}
}
using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
namespace GameSaveExample
{
class Program
{
static async Task Main(string[] args)
{
try
{
var rootDirectory = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"AppName");
using var repository = new GameSaveRepository(rootDirectory, "SaveFile.bin");
Console.WriteLine("Первоначальная загрузка данных и вывод на экран:");
SaveData data = await repository.Load();
Display(data);
Console.WriteLine("Сохраняем изменённые данные и выводим на экран:");
data.Id += 5;
await repository.Save(data);
Display(data);
Console.WriteLine("-------------------------");
Console.WriteLine("Загружаем данные из файла и выводим на экран:");
data = await repository.Load();
Display(data);
Process.Start("explorer.exe", rootDirectory);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
private static void Display(SaveData data)
{
Console.WriteLine($"Version: {data.Version}, ID: {data.Id}");
}
}
}
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace GameSaveExample
{
/// <summary>
/// Класс, который умеет сохранять данные и загружать.
/// </summary>
public class GameSaveRepository : IDisposable
{
private readonly string _rootDirectory;
private readonly string _fileName;
private readonly string _pathToFile;
private readonly SemaphoreSlim _semaphore;
public GameSaveRepository(string rootDirectory, string fileName)
{
_rootDirectory = rootDirectory;
_fileName = fileName;
_pathToFile = Path.Combine(_rootDirectory, fileName);
_semaphore = new SemaphoreSlim(1);
}
public async Task<SaveData> Load()
{
await _semaphore.WaitAsync();
var data = new SaveData();
try
{
await Task.Run(() =>
{
if (File.Exists(_pathToFile))
{
using var stream = File.OpenRead(_pathToFile);
using var reader = new BinaryReader(stream);
data.Version = reader.ReadInt32();
data.Id = reader.ReadInt32();
}
});
return data;
}
catch (Exception ex)
{
Debug.WriteLine(ex);
throw;
}
finally
{
_semaphore.Release();
}
}
public async Task Save(SaveData data)
{
await _semaphore.WaitAsync();
try
{
await Task.Run(() =>
{
if (!Directory.Exists(_rootDirectory))
{
Directory.CreateDirectory(_rootDirectory);
}
using var stream = File.OpenWrite(_pathToFile);
using var writer = new BinaryWriter(stream);
writer.Write(data.Version);
writer.Write(data.Id);
});
}
catch (Exception ex)
{
Debug.WriteLine(ex);
throw;
}
finally
{
_semaphore.Release();
}
}
public void Dispose()
{
_semaphore?.Dispose();
}
}
}
namespace GameSaveExample
{
public class SaveData
{
/// <summary>
/// Версия формата файла. Добавил, удалил или изменил свойство, тогда поднимаем версию.
/// На каждую версию свой класс сериализатор-десериализатор.
/// </summary>
public int Version { get; set; }
/// <summary>
/// Какие-то данные.
/// </summary>
public int Id { get; set; }
}
}
public override Base CreateCopy()
public override Derivative CreateCopy()
using System;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var objectBase = new Base("Base");
var objectDerivative = new Derivative("Derivative", '7');
var copyBase = objectBase.CreateCopy();
var copyDerivative = objectDerivative.CreateCopy();
Console.WriteLine(copyBase);
Console.WriteLine(copyDerivative);
}
}
public class Base
{
private readonly string _text;
public string Text
{
get { return _text; }
}
public Base(string text)
{
_text = text;
}
public virtual Base CreateCopy()
{
return new Base(Text);
}
public override string ToString()
{
return $"{nameof(Text)}: {Text}";
}
}
public class Derivative : Base
{
private readonly char _symbol;
public char Symbol
{
get { return _symbol; }
}
public Derivative(string text, char symbol)
: base(text)
{
_symbol = symbol;
}
public override Base CreateCopy()
{
return new Derivative(Text, Symbol);
}
public override string ToString()
{
return $"{nameof(Text)}: {Text}, {nameof(Symbol)}: {Symbol}";
}
}
}
string password = "sKzvYk#1Pn33!YN"; // The password to encrypt the data with
string plaintext = "Top secret data"; // The string to encrypt
// Encrypt the string
string ciphertext = Rijndael.Encrypt(plaintext, password, KeySize.Aes256);
// Decrypt the string
plaintext = Rijndael.Decrypt(ciphertext, password, KeySize.Aes256);
Как организовать постоянное обновление DataGrid в отдельном потоке, чтобы при этом DataGrid был доступен, т.к. планируется добавить возможность выбирать строку из DataGrid и смотреть подробную информацию.
using System;
using System.Threading.Tasks;
namespace Tasks
{
class Program
{
static async Task Main(string[] args)
{
// Так
await Task.Run(async () =>
{
while (true)
{
await Task.Delay(1000);
Console.Write("=");
}
});
// Или так (обрати внимание на Unwrap())
await Task.Factory.StartNew(async () =>
{
while (true)
{
await Task.Delay(1000);
Console.Write("=");
}
}).Unwrap();
}
}
}
public FileStream(string path, FileMode mode) :
this(path, mode, (mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite), DefaultShare, DefaultBufferSize, DefaultIsAsync)
{ }
using (FileStream source = new FileStream("NLog.config", FileMode.Open))
using (FileStream source2 = new FileStream("NLog.config", FileMode.Open))
using (FileStream target = new FileStream("newPath", FileMode.OpenOrCreate))
{
await source.CopyToAsync(target);
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RestSharp" Version="106.11.7" />
<PackageReference Include="RestSharp.Serializers.SystemTextJson" Version="106.11.7" />
</ItemGroup>
</Project>
using System.Threading.Tasks;
using System.Web;
using RestSharp;
using RestSharp.Serializers.SystemTextJson;
using RestSharpExample.Api.Kinopoisk.Model;
namespace RestSharpExample.Api.Kinopoisk
{
public class KinopoiskService
{
private const string API = "https://api.kinopoisk.cloud/";
private const string TOKEN = "7777";
private readonly RestClient _client;
public KinopoiskService()
{
_client = new RestClient(API);
_client.UseSystemTextJson();
}
public async Task<SearchResult> SearchAsync(string movieTitle)
{
var request = new RestRequest($"movies/search/{HttpUtility.UrlEncode(movieTitle)}/token/{TOKEN}", Method.GET);
var response = await _client.ExecuteAsync<SearchResult>(request);
return response.Data;
}
}
}
using System;
using System.Linq;
using System.Threading.Tasks;
using RestSharpExample.Api.Kinopoisk;
using RestSharpExample.Api.Kinopoisk.Model;
namespace RestSharpExample
{
class Program
{
private KinopoiskService _kinopoisk;
#region Entry point
static async Task Main(string[] args)
{
var program = new Program();
await program.Run(args);
}
#endregion
private async Task Run(string[] args)
{
_kinopoisk = new KinopoiskService();
try
{
string searchRequest = "Дурак";
SearchResult result = await _kinopoisk.SearchAsync(searchRequest);
Console.WriteLine($"Результаты поиска по запросу \"{searchRequest}\":");
if (result.Results.Any())
{
Display(result.Results.First());
}
else
{
Console.WriteLine("Ничего не найдено.");
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
private void Display(SearchMovieInfo info)
{
Console.WriteLine($"ИД: {info.Id}, Название: {info.Title}, Год: {info.Year}");
}
}
}
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace RestSharpExample.Api.Kinopoisk.Model
{
public class SearchResult
{
[JsonPropertyName("results")]
public List<SearchMovieInfo> Results { get; set; }
[JsonPropertyName("pagination")]
public Pagination Pagination { get; set; }
}
}
using System.Text.Json.Serialization;
namespace RestSharpExample.Api.Kinopoisk.Model
{
public class SearchMovieInfo
{
[JsonPropertyName("id")]
public string Id { get; set; }
[JsonPropertyName("id_kinopoisk")]
public int IdKinopoisk { get; set; }
[JsonPropertyName("title")]
public string Title { get; set; }
[JsonPropertyName("description")]
public string Description { get; set; }
[JsonPropertyName("year")]
public int Year { get; set; }
[JsonPropertyName("poster")]
public string Poster { get; set; }
[JsonPropertyName("rating_kinopoisk")]
public double? RatingKinopoisk { get; set; }
[JsonPropertyName("rating_imdb")]
public double? RatingImdb { get; set; }
}
using System.Text.Json.Serialization;
namespace RestSharpExample.Api.Kinopoisk.Model
{
public class Pagination
{
[JsonPropertyName("current_page")]
public string CurrentPage { get; set; }
[JsonPropertyName("end_page")]
public string EndPage { get; set; }
[JsonPropertyName("total_pages")]
public int TotalPages { get; set; }
}
}