C# Language
Funkcje C # 5.0
Szukaj…
Składnia
Asynchronizuj i czekaj
public Task MyTask Async () {doSomething (); }
czekaj na MyTaskAsync ();
public Task
<string>
MyStringTask Async () {return getSomeString (); }string MyString = czekaj na MyStringTaskAsync ();
Atrybuty informacji o dzwoniącym
public void MyCallerAttributes (ciąg MyMessage,
[CallerMemberName] string MemberName = "",
[CallerFilePath] string SourceFilePath = "",
[CallerLineNumber] int LineNumber = 0)
Trace.WriteLine („My Message:” + MyMessage);
Trace.WriteLine („Member:” + MemberName);
Trace.WriteLine („Ścieżka pliku źródłowego:” + SourceFilePath);
Trace.WriteLine („Numer linii:” + Numer linii);
Parametry
Metoda / modyfikator z parametrem | Detale |
---|---|
Type<T> | T jest rodzajem zwrotu |
Uwagi
C # 5.0 jest połączony z Visual Studio .NET 2012
Asynchronizuj i czekaj
async
i await
to dwa operatory, które mają na celu poprawę wydajności poprzez zwolnienie wątków i czekanie na zakończenie operacji przed przejściem do przodu.
Oto przykład uzyskania ciągu przed zwróceniem jego długości:
//This method is async because:
//1. It has async and Task or Task<T> as modifiers
//2. It ends in "Async"
async Task<int> GetStringLengthAsync(string URL){
HttpClient client = new HttpClient();
//Sends a GET request and returns the response body as a string
Task<string> getString = client.GetStringAsync(URL);
//Waits for getString to complete before returning its length
string contents = await getString;
return contents.Length;
}
private async void doProcess(){
int length = await GetStringLengthAsync("http://example.com/");
//Waits for all the above to finish before printing the number
Console.WriteLine(length);
}
Oto kolejny przykład pobierania pliku i obsługi tego, co się stanie, gdy zmieni się jego postęp i gdy pobieranie się zakończy (istnieją dwa sposoby:
Metoda 1:
//This one using async event handlers, but not async coupled with await
private void DownloadAndUpdateAsync(string uri, string DownloadLocation){
WebClient web = new WebClient();
//Assign the event handler
web.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
web.DownloadFileCompleted += new AsyncCompletedEventHandler(FileCompleted);
//Download the file asynchronously
web.DownloadFileAsync(new Uri(uri), DownloadLocation);
}
//event called for when download progress has changed
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e){
//example code
int i = 0;
i++;
doSomething();
}
//event called for when download has finished
private void FileCompleted(object sender, AsyncCompletedEventArgs e){
Console.WriteLine("Completed!")
}
Metoda 2:
//however, this one does
//Refer to first example on why this method is async
private void DownloadAndUpdateAsync(string uri, string DownloadLocation){
WebClient web = new WebClient();
//Assign the event handler
web.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
//Download the file async
web.DownloadFileAsync(new Uri(uri), DownloadLocation);
//Notice how there is no complete event, instead we're using techniques from the first example
}
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e){
int i = 0;
i++;
doSomething();
}
private void doProcess(){
//Wait for the download to finish
await DownloadAndUpdateAsync(new Uri("http://example.com/file"))
doSomething();
}
Atrybuty informacji o dzwoniącym
CIA są pomyślane jako prosty sposób na uzyskanie atrybutów z tego, co wywołuje metodę docelową. Jest tak naprawdę tylko jeden sposób na ich użycie i są tylko 3 atrybuty.
Przykład:
//This is the "calling method": the method that is calling the target method
public void doProcess()
{
GetMessageCallerAttributes("Show my attributes.");
}
//This is the target method
//There are only 3 caller attributes
public void GetMessageCallerAttributes(string message,
//gets the name of what is calling this method
[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
//gets the path of the file in which the "calling method" is in
[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
//gets the line number of the "calling method"
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
//Writes lines of all the attributes
System.Diagnostics.Trace.WriteLine("Message: " + message);
System.Diagnostics.Trace.WriteLine("Member: " + memberName);
System.Diagnostics.Trace.WriteLine("Source File Path: " + sourceFilePath);
System.Diagnostics.Trace.WriteLine("Line Number: " + sourceLineNumber);
}
Przykładowe dane wyjściowe:
//Message: Show my attributes.
//Member: doProcess
//Source File Path: c:\Path\To\The\File
//Line Number: 13