कैसे एक कोड एक अतुल्यकालिक WPF (या Windows फ़ॉर्म के लिए) घटना एफ # में हैंडलर? विशेष रूप से, क्या कोई कोडिंग पैटर्न है जो सी # 5 के एसिंक को अनुमानित करता है और प्रतीक्षा करता है?एफ # WPF के लिए अतुल्यकालिक ईवेंट हैंडलर्स सी # के async के समान और इंतजार
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
class Program
{
static int IncrementSlowly(int previous)
{
Thread.Sleep(3000);
if (previous == 2) throw new Exception("Oops!");
return previous + 1;
}
static async void btn_Click(object sender, RoutedEventArgs e)
{
var btn = sender as Button;
btn.IsEnabled = false;
try
{
var prev = (int)btn.Content;
btn.Content = await Task.Run(() => IncrementSlowly(prev));
}
catch (Exception ex)
{
btn.Content = ex.Message;
}
finally
{
btn.IsEnabled = true;
}
}
[STAThread]
static void Main(string[] args)
{
var btn = new Button() { Content = 0 };
var win = new Window() { Content = btn };
btn.Click += btn_Click;
new Application().Run(win);
}
}
मैं मुसीबत पता लगाना क्या बराबर एफ # का उपयोग कर किया जाएगा हो रहा है:
यहां एक संपूर्ण सी # WPF अनुप्रयोग है। मैंने async वर्कफ़्लो और Async विधियों के संयोजन का उपयोग करके कई प्रयास किए हैं। यह वास्तव में वास्तव में गन्दा असली तेजी से हो जाता है। मुझे आशा है कि एक आसान तरीका है कि मैं बस देख रहा हूं।
यहाँ मेरी प्रारंभिक बिंदु है, जो btn.Content <- incrementSlowly prev
पर यूआई अप ताले है। अब मुझे आगे क्या करना है?
open System
open System.Threading
open System.Threading.Tasks
open System.Windows
open System.Windows.Controls
let incrementSlowly previous =
Thread.Sleep(3000)
if previous = 2 then failwith "Oops!"
previous + 1
let btn_Click (sender : obj) e =
let btn = sender :?> Button
btn.IsEnabled <- false
try
try
let prev = btn.Content :?> int
btn.Content <- incrementSlowly prev
with ex -> btn.Content <- ex.Message
finally
btn.IsEnabled <- true
[<EntryPoint>][<STAThread>]
let main _ =
let btn = new Button(Content = 0)
let win = new Window(Content = btn)
btn.Click.AddHandler(RoutedEventHandler(btn_Click))
Application().Run(win)
वैसे, मान लेते हैं कि incrementSlowly
बदला नहीं जा सकता।
इस लेख उपयोगी होना चाहिए http://tomasp.net/blog/csharp-fsharp- का प्रबंधन async-intro.aspx/ –