Если Вы не заботитесь о возврате ничего пользователю, можно просто разжечь или отдельный поток, или для быстрого и грязного подхода, использовать делегата и вызвать его asynchrnously. Если Вы не заботитесь об уведомлении пользователя, когда асинхронная задача заканчивается, можно проигнорировать обратный вызов. Попытайтесь поместить точку останова в конце SomeVeryLongAction () метод, и Вы будете видеть, что это заканчивает бежать за страницей, был уже подан:
private delegate void DoStuff(); //delegate for the action
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
//create the delegate
DoStuff myAction = new DoStuff(SomeVeryLongAction);
//invoke it asynchrnously, control passes to next statement
myAction.BeginInvoke(null, null);
Button1.Text = DateTime.Now.ToString();
}
private void SomeVeryLongAction()
{
for (int i = 0; i < 100; i++)
{
//simulation of some VERY long job
System.Threading.Thread.Sleep(100);
}
}
Методы расширения могут быть определены только в статическом неуниверсальном внешнем (невложенном) классе.
Что я обычно делаю в таких сценариях, так это создаю отдельный статический внутренний класс в другом пространстве имен в том же файле, а затем включаю это пространство имен только в этот файл.
Он все равно будет виден другим классам в этой сборке; единственный способ избежать этого - переместить потребляющий класс ( класс A
в вашем примере) в его собственную сборку, чего вы, вероятно, не захотите делать.
Объявите свои методы расширения в отдельном пространстве имен, и вы можете включить это пространство имен в определенные файлы, которые вы хотите их использовать. Затем объявите ClassA (класс, в котором вы хотите использовать свои методы расширения) в отдельном файле и используйте это пространство имен в верхней части ClassA.cs. Таким образом, только этот класс будет иметь доступ к этим методам расширения.
Изменить:
Что-то вроде следующего
namespace Extension {
public static class ExtensionMethods {
public static string EnumValue(this MyEnum e) {
switch (e) {
case MyEnum.First:
return "First Friendly Value";
case MyEnum.Second:
return "Second Friendly Value";
case MyEnum.Third:
return "Third Friendly Value";
}
return "Horrible Failure!!";
}
}
}
ClassA.cs:
using Extension;
public class ClassA{
//Work your magic here, using the EnumValue Extension method
//wherever you want
}
ClassB.cs
public class ClassB{
//EnumValue is not a valid Extension Method here.
}