在多层Windows窗体应用程序中实现异步/任务/等待

时间:2018-07-28 20:30:32

标签: c# wcf asynchronous async-await task

我希望在Windows Form应用程序中实现异步/任务实现方面有所帮助。

在此应用程序中,我使用WCF服务从数据中心SQl服务器数据库中检索数据,因此此代码的一部分在客户端上运行,而某些代码在数据中心服务器上运行,以检索数据并将其返回。我想使用客户端或服务器上(最好同时使用两者)上的异步/任务来优化代码。示例代码从带有按钮的Windows窗体开始,单击该按钮可从数据库中获取一个值,将其显示并更新局部变量。

我不清楚我是否可以简单地实现async / Task和Task。在第一个按钮click事件中运行,或者是否应通过所有方法(或介于两者之间)级联代码。我也不清楚如何处理wcf服务。

我创建了一个简化的代码示例,非常接近顺序。 在此代码中,返回值将更新Windows窗体。我想看看如何为此目的使用async / Task等待来优化此代码,以及如果代码未返回值又会有什么不同。

public partial class Form1 : Form
{
    int returnvalue = 0;
    public Form1()
    {
        InitializeComponent();
    }

    private void btnGetResult_Click(object sender, EventArgs e)
    {
        int rowcount = ChangeProductPrice(.05m);
        txtResult.Text = rowcount.ToString();
    }

    private int ChangeProductPrice(decimal priceincrease)
    {
        int rv = MyData.WebServiceObject.ChangePrice(priceincrease);
        UpdateLocalVariables(rv);
        return rv;
    }
    private void UpdateLocalVariables(int rv)
    {
        returnvalue = rv;
    }

}
public static class MyData
{
    private static IMyDataWCFService _webserviceobject = null;

    public static IMyDataWCFService WebServiceObject
    {
        get
        {
            if (_webserviceobject is null)
            {
                //...code to initialize it
            }
            return _webserviceobject;
        }
    }
}
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IMyDataWCFService
{
    [OperationContract]
    int ChangePrice(decimal priceincrease);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]

public class MyDataWCFService : IMyDataWCFService
{
    private MyDataService _serviceObject = null;
    private MyDataService ServiceObject
    {
        get
        {
            if (_serviceObject == null)
            {
                _serviceObject = new MyDataService();
            }
            return _serviceObject;
        }
    }
    public int ChangePrice(decimal priceincrease)
    {
        return ServiceObject.ChangePrice(priceincrease);
    }
}
public class MyDataService  //running on server
{
    public int ChangePrice(decimal priceincrease)
    {
        int rows = 0;
        SqlConnection conn = null;
        try
        {
            conn = this.GetSqlConnection();
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn;
                cmd.CommandText = "mysp_UpdatePrice";
                cmd.Parameters.Add(new SqlParameter("@Rate", priceincrease));
                conn.Open();
                rows = cmd.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
            ProcessError(ex);
        }
        finally
        {
            if (conn != null)
                ReturnSqlConnection(conn);
        }
        return rows;
    }
    private SqlConnection GetSqlConnection()
    {
        //dostuff;
        return new SqlConnection();
    }
    private void ProcessError(Exception ex)
    {
        //dostuff;
    }
    private void ReturnSqlConnection(SqlConnection conn)
    {
        //dostuff;
    }
}

0 个答案:

没有答案