Managing your own synchronicity
Using asynchronous methods is never going to be as simple as using synchronous methods, and you are unlikely to ever get language that supports what you are suggesting. To have an assignment which completes non-deterministically would probably lead to some very difficult to diagnose bugs!
A different approach would be to handle the synchronicity yourself - kick off the operation a new thread directly from the button event handlers, and then use synchronous methods to do the work:
[code=csharp]void button1_handler(object sender, EventArgs e) {
ThreadPool.QueueUserWorkItem(PopulateList, "button1");
}
void button2_handler(object sender, EventArgs e) {
ThreadPool.QueueUserWorkItem(PopulateList, "button2");
}
void PopulateList(object state) {
listBox1.ItemsSource = dal.GetList((string) state);
//Do other work here
}[/code]
This keeps the program flow nice and logical.
Good luck 