game.Status = "playing"
должен выставиться сразу, или сначала нужно послать несколько сообщений пользователям с интервалом в 1 секунду, и уже потом игра переходит в состояние playing? Предположу, что второе.public async Task StartAsync(CancellationToken cancellationToken)
{
// Хорошим тоном считается использовать CancellationToken, если он есть.
// Иначе задачу невозможно будет отменить.
await DoWork(cancellationToken);
}
class Crypto2
{
private readonly int[] _key;
private readonly int[] _inversedKey;
public Crypto2(string key)
{
var indexPairs = key
.Select((chr, idx1) => new { chr, idx1 }) // присваиваем каждому символу индекс
.OrderBy(arg => arg.chr) // сортируем по символам
.Select((arg, idx2) => new { arg.idx1, idx2 }) // и теперь создаём массив из пар "первоначальный индекс" <=> "отсортированный индекс".
.ToArray();
// Генерируем прямой ключ: чем "меньше" символ (в алфавитном порядке), тем меньше его индекс в конечном массиве.
// "а" => 0, ... , "ь" => 5
// Получаем: "цезарь" => [4, 1, 2, 0, 3, 5]
_key = indexPairs
.OrderBy(arg => arg.idx1)
.Select(arg => arg.idx2)
.ToArray();
// Обратная операция для декодирования
_inversedKey = indexPairs
.OrderBy(arg => arg.idx2)
.Select(arg => arg.idx1)
.ToArray();
}
public string Encrypt(string message)
{
return EncryptDecrypt(message, _key);
}
public string Decrypt(string message)
{
return EncryptDecrypt(message, _inversedKey);
}
private static string EncryptDecrypt(string message, int[] key)
{
var keyLength = key.Length;
var messageLength = message.Length;
if (messageLength % keyLength > 0)
{
// Дополняем строку пробелами, если необходимо
message = message.PadRight(messageLength + keyLength - messageLength % keyLength, ' ');
}
// Никогда не используйте конкатенацию строк в цикле (типа result += keyValuePairs[editKey[j]][i].ToString();). Это очень медленно.
// Для этих целей есть специальный класс StringBuilder.
// Мы заранее знаем длину конечной строки, поэтому инициализируем StringBuilder правильно.
var sb = new StringBuilder(messageLength) {Length = message.Length};
for (var i = 0; i < message.Length; i++)
{
// Вычисляем конечный индекс для вставки символа.
// Первая часть выражения "i / keyLength * keyLength" - округление i вниз до ближайшего значения, делящегося на keyLength
// Вторая часть "key[i % keyLength]" - вычисление новой позиции символа на основе ключа.
var idx = i / keyLength * keyLength + key[i % keyLength];
sb[idx] = message[i];
}
return sb.ToString();
}
}
class Crypto3
{
private readonly int[] _key;
private readonly int[] _inversedKey;
public Crypto3(string key)
{
var indexPairs = key
.Select((chr, idx1) => new {chr, idx1})
.OrderBy(arg => arg.chr)
.Select((arg, idx2) =>
new
{
arg.idx1, idx2
})
.ToArray();
_key = indexPairs
.OrderBy(arg => arg.idx1)
.Select(arg => arg.idx2)
.ToArray();
_inversedKey = indexPairs
.OrderBy(arg => arg.idx2)
.Select(arg => arg.idx1)
.ToArray();
}
public void Encrypt(string sourceFile, string destinationFile)
{
EncryptDecrypt(sourceFile, destinationFile, _key);
}
public void Decrypt(string sourceFile, string destinationFile)
{
EncryptDecrypt(sourceFile, destinationFile, _inversedKey);
}
private static void EncryptDecrypt(string sourceFile, string destinationFile, int[] key)
{
var keyLength = key.Length;
var buffer1 = new byte[keyLength];
var buffer2 = new byte[keyLength];
using (var source = new FileStream(sourceFile, FileMode.Open))
using (var destination = new FileStream(destinationFile, FileMode.OpenOrCreate))
{
while (true)
{
var read = source.Read(buffer1, 0, keyLength);
if (read == 0)
{
return;
}
else if (read < keyLength)
{
for (int i = read; i < keyLength; i++)
{
buffer1[i] = (byte) ' ';
}
}
for (var i = 0; i < keyLength; i++)
{
var idx = i / keyLength * keyLength + key[i % keyLength];
buffer2[idx] = buffer1[i];
}
destination.Write(buffer2, 0, keyLength);
}
}
}
}
Install-Package Microsoft.CodeAnalysis.CSharp.Scripting
int result = await CSharpScript.EvaluateAsync<int>("14 - 15");
int i = 0;
// HIDE: i
for(int j=0; j<=N; j++) {
if(elem[i]==null) { // Ошибка компиляции: использование запрещённой переменной.
}
}
// SHOW: i
i++; // Нет ошибки.
int i = 0;
using (CompilerUtils.HideVar(i))
{
for(int j=0; j<=N; j++){
if(elem[i]==null) { // Ошибка компиляции: использование запрещённой переменной
}
}
}
i++; // OK.
public static class CompilerUtils
{
public static IDisposable HideVar(params object[] vars)
{
return <пустая реализация IDisposable>;
}
}
Dictionary<Type, IController>
.VirtualizingStackPanel.VirtualizationMode="Recycling"
(который используется по умолчанию) не всем элементам массива ParameterList будут соответствовать TextBox-ы. Предполагается что данные в этих textbox будут меняться и передаваться дальше.
data: {stat: "Hello"}
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Diagnostics;
namespace ThreadsTests
{
public class WorkData
{
public int Id;
}
public abstract class ProtoBase<T>
{
private static int NextId;
private TaskCompletionSource<T> _dataTaskCompletionSource = new TaskCompletionSource<T>();
public int give_count = 1;
protected ProtoBase()
{
Id = ++NextId;
new Task(Parse).Start();
}
public int Id { get; }
public bool IsFinish { get; private set; }
protected void Finish()
{
IsFinish = true;
}
public async Task PushData(T data)
{
_dataTaskCompletionSource.SetResult(data);
await Task.Yield();
}
protected async Task<T> GetNextData()
{
var taskResult = await _dataTaskCompletionSource.Task;
_dataTaskCompletionSource = new TaskCompletionSource<T>();
return taskResult;
}
protected abstract void Parse();
}
public class TestWorker : ProtoBase<WorkData>
{
protected override async void Parse()
{
WorkData data = await GetNextData();
Trace.TraceInformation("{0:N0} take 1 [id={1:N0}]", Id, data.Id);
data = await GetNextData();
Trace.TraceInformation("{0:N0} take 2 [id={1:N0}]", Id, data.Id);
data = await GetNextData();
Trace.TraceInformation("{0:N0} take 3 [id={1:N0}]", Id, data.Id);
Finish();
Trace.TraceInformation("{0:N0} Finish ххх", Id);
}
}
public class Program
{
public static async Task Main(string[] args)
{
var schedulerPair = new ConcurrentExclusiveSchedulerPair();
await await Task.Factory.StartNew(
AsyncWorkersTest,
CancellationToken.None,
TaskCreationOptions.None,
schedulerPair.ExclusiveScheduler);
Console.WriteLine("FINISHED");
Console.ReadKey();
}
public static async Task AsyncWorkersTest()
{
//workers count
const int testCount = 1000; // 100, 1000, 10000, 100000
var Workers = new List<TestWorker>();
for (int i = 0; i < testCount; i++)
{
Workers.Add(new TestWorker());
}
Random rnd = new Random();
int getDataCount = testCount * 3;
for (int i = 0; i < getDataCount; i++)
{
int ind = rnd.Next(0, Workers.Count);
WorkData wd = new WorkData() { Id = i };
if (Workers[ind].IsFinish) continue;
Trace.TraceInformation("{0:N0} push {1} [id={2:N0}]", Workers[ind].Id, Workers[ind].give_count++, wd.Id);
await Workers[ind].PushData(wd);
}
}
}
}
ConsoleApp1 Information: 0 : 1 push 1 [id=0]
ConsoleApp1 Information: 0 : 1 take 1 [id=0]
ConsoleApp1 Information: 0 : 2 push 1 [id=1]
ConsoleApp1 Information: 0 : 2 take 1 [id=1]
ConsoleApp1 Information: 0 : 1 push 2 [id=2]
ConsoleApp1 Information: 0 : 1 take 2 [id=2]
ConsoleApp1 Information: 0 : 1 push 3 [id=3]
ConsoleApp1 Information: 0 : 1 take 3 [id=3]
ConsoleApp1 Information: 0 : 1 Finish ххх
ConsoleApp1 Information: 0 : 2 push 2 [id=4]
ConsoleApp1 Information: 0 : 2 take 2 [id=4]
ConsoleApp1 Information: 0 : 2 push 3 [id=5]
ConsoleApp1 Information: 0 : 2 take 3 [id=5]
ConsoleApp1 Information: 0 : 2 Finish ххх
private async Task<string> jsexec()
{
string script = "$('.page_title').text()";
var response = await chromeBrowser.EvaluateScriptAsync(script);
if (response.Success && response.Result != null)
{
var result = response.Result.ToString();
MessageBox.Show(result);
return result;
}
else
{
return null;
}
}