IIssueService
, в который перенести методы AcceptToWork
, Close
и т.д., которые будут принимать на вход ту Issue, над которой выполняется действие.IIssueService
различными менеджерами типа IConfigurationManager
и IDateTimeProvider
. throw;
) или в обёртке из business-specific исключения: try
{
return int.Parse(stringValue);
}
catch (FormatException ex)
{
Logger.Error(ex);
throw new MyParserException($"Неверный формат числа {stringValue}", ex);
}
catch (OverflowException ex)
{
Logger.Error(ex);
throw new MyParserException($"Выход за допустимый диапазон {stringValue}", ex);
}
. var secondFileLines = new HashSet<string>(File.ReadLines("<файл2>"));
using (var writer = new StreamWriter("<файл3>"))
{
foreach (var line in File.ReadLines("<файл1>"))
{
if (!secondFileLines.Contains(line))
{
writer.WriteLine(line);
}
}
}
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "mystem.exe";
p.StartInfo.Arguments = "-n input.txt";
p.Start();
using (var reader = new StreamReader(p.StandardOutput.BaseStream, Encoding.UTF8))
{
textBox3.Text = reader.ReadToEnd();
}
p.WaitForExit();
<Window x:Class="ссылка на класс Login" ...>
...
</Window>
Пробовал через класс Progress, но тут мне не понравилось плодить большое кол во классов через
Progress.Report(new MyReport{...});
public interface IProgressInfo
{
bool IsCompleted { get; }
}
public class ProgressInfo : IProgressInfo
{
public ProgressInfo(double completedPercentage, string progressStatusText)
{
CompletedPercentage = completedPercentage;
ProgressStatusText = progressStatusText;
}
public double CompletedPercentage { get; private set; }
public string ProgressStatusText { get; private set; }
public bool IsCompleted
{
get { return CompletedPercentage >= 1; }
}
}
public class Progress<T> : IProgress<T> where T : class, IProgressInfo
{
private T _previousProgressInfo;
private volatile T _progressInfo;
private readonly Action<T> _updateProgressAction;
private readonly Timer _timer;
private readonly SynchronizationContext _synchronizationContext;
public Progress(TimeSpan pollingInterval, Action<T> updateProgressAction)
{
_synchronizationContext = SynchronizationContext.Current ?? new SynchronizationContext();
_updateProgressAction = updateProgressAction;
_timer = new Timer(TimerCallback, null, pollingInterval, pollingInterval);
}
private void TimerCallback(object state)
{
ProcessUpdate();
}
private void ProcessUpdate()
{
var progressInfo = _progressInfo;
if (_previousProgressInfo != progressInfo)
{
_synchronizationContext.Send(state => _updateProgressAction((T) state), progressInfo);
}
_previousProgressInfo = progressInfo;
}
public void Report(T value)
{
_progressInfo = value;
if (value.IsCompleted)
{
_timer.Dispose();
ProcessUpdate();
}
}
}
var workClass = new WorkClass();
var list = Enumerable.Range(1, 1000).Select(i => i.ToString()).ToArray();
var progress = new Progress<ProgressInfo>(TimeSpan.FromMilliseconds(100), UpdateProgressAction);
await workClass.LongMethod(list, progress);
private void UpdateProgressAction(ProgressInfo obj)
{
ProgressBar.Value = obj.CompletedPercentage;
OperationStatus.Text = obj.ProgressStatusText;
ProgressBarPercentage.Text = string.Format("{0:P}", obj.CompletedPercentage);
}
internal class WorkClass
{
public async Task LongMethod(IReadOnlyList<string> something, IProgress<ProgressInfo> progress)
{
await Task.Factory.StartNew(() =>
{
var count = something.Count;
for (int i = 0; i < count; i++)
{
var element = something[i];
Thread.Sleep(5);
progress.Report(new ProgressInfo((double)(i + 1) / count, element));
}
});
}
}
int count;
dictionary.TryGetValue(word, out count);
dictionary[word] = count + 1;
var parsedValue = BigInteger.Parse("081a8269359ea02246152537192c7827", NumberStyles.HexNumber);
var result = (double)parsedValue;
class Program
{
static void Main()
{
var personList = GenerateList(15); // personList указывает на первого человека в списке
PrintList(personList);
var p = personList;
while (p != p.NextPerson) // пока человек не остался один в списке
{
#region Этот кусок для корректного вывода списка на экран. Если вывод не нужен, можно убрать
if (personList == p.NextPerson)
{
personList = p.NextPerson.NextPerson;
}
#endregion
// <ВсяСоль>
p = p.NextPerson = p.NextPerson.NextPerson;
// </ВсяСоль>
// Если убрать верхний регион, то может возникнуть ситуация, когда personList указывает на
// человека, который был удалён из списка. Возникнет бесконечный цикл.
PrintList(personList);
}
}
// Вывод списка на консоль
private static void PrintList(Person personList)
{
var p = personList;
do
{
System.Console.Out.Write(p.SequenceNumber);
System.Console.Out.Write(" ");
p = p.NextPerson;
} while (p != personList);
System.Console.Out.WriteLine();
}
// Генерация списка
private static Person GenerateList(int n)
{
// Начинаем с последнего человека
var currentPerson = new Person(n);
var lastPerson = currentPerson;
// затем создаём N-1 человек, указывая его порядковый номер и следующего за ним человека
for (int i = n - 1; i > 0; i--)
{
currentPerson = new Person(i) { NextPerson = currentPerson };
}
// последнего человека закольцовываем с первым
lastPerson.NextPerson = currentPerson;
return currentPerson;
}
}
class Person
{
public Person(int sequenceNumber)
{
SequenceNumber = sequenceNumber;
}
public int SequenceNumber { get; private set; }
public Person NextPerson { get; set; }
}