Люди на SO здесь не для того, чтобы писать код для вас, а для решения проблем. В любом случае, я расскажу вам, как вы можете это сделать, и вы создадите собственный код на его основе.
Прежде всего, DLL - это библиотека динамических ссылок, и таким образом вы можете присоединить ее к любому вашему проекту (winform или unity 3d игра, и нет, вы не будете делать это, но допустим, что она может использоваться в обоих случаях), поэтому если вы уже пишете DLL, сделайте ее пригодной для использования во многих сценариях и дайте программисту, использующему ее, множество возможностей для манипулирования.
Итак, ваша задача здесь разделена на 2 части.
- Рассчитать данные
- Сообщите, на каком этапе расчета вы сейчас находитесь
Для этой задачи мы будем использовать события и простой цикл for
, чтобы показать вам, как это работает.
Прежде всего давайте создадим EventArgs
класс, который будет хранить все данные, которые мы хотим передать, когда программист из другого события перехвата кода
public class CustomEventArgs
{
public int OldResult { get; set; }
public int NewResult { get; set; }
}
Теперь, когда у нас есть класс событий, давайте реализуем его в нашем коде.
public class YourDllCalculation
{
// In the .NET Framework class library, events are based on the EventHandler delegate and the EventArgs base class.
// So we create delegate using our newly created class to represents it like EventHandler
public delegate void ResultChangeEventHandler(object sender, CustomEventArgs e);
// Now we create our event
public event IzborRobeEventHandler ResultChanged;
// Local storing variable
private int Result = 0;
// This is method from which you inform event something changed and user listening to event catch EventArgs passed (in our case our CustomEventArgs)
protected virtual void OnResultChange(CustomEventArgs e)
{
ResultChangeEventHandler h = ResultChanged;
if (h != null)
h(this, e);
}
// We will use this method from new code to start calculation;
public void StartCalculation()
{
// Calculation will be done in separate thread so your code could proceed further if needed
Thread t1 = new Thread(Calculate);
t1.Start();
}
private void Calculate()
{
for(int i = 0; i < 100; i++)
{
OnResultChange(new CustomEventArgs() { OldResult = i, NewResult = i + 1 });
Result = i;
Thread.Sleep(1000); // Pause thread from running for 1 sec
}
}
}
Теперь, когда у нас есть код, мы можем использовать его следующим образом в нашей winform:
// Add at top
using YourDllNamespace;
public YourForm()
{
// Creating our class for calculation
YourDllCalculation calc = new YourDllCalculation();
calc += CalculationResultChanged;
calc.Calculate();
}
private void CalculationResultChanged(object sender, CustomEventArgs e)
{
// Here do whatever you want with passed values
// e.OldResult;
// e.NewResult;
// it will fire each second
}