C#多线程与异步调用

实例1:显示进度条的调用
  // 执行任务的委托声明(解决长任务假死)
  delegate void RunTaskDelegate(int seconds);
  // 显示进度条的委托声明(跨线程调用控件)
  delegate void ShowProgressDelegate(int totalStep, int currentStep);
  private void ShowProgress(int totalStep, int currentStep)
  {
    progressBar1.Maximum = totalStep;
    progressBar1.Value = currentStep;
  }
  private void RunTask(int seconds)
  {
    ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress);
    for (int i = 0; i < seconds * 4; i++)
    {
      Thread.Sleep(250);
      // 在基础窗口上调用显示进度条的委托
      this.Invoke(showProgress, new object[] { seconds * 4, i + 1 });
    }
  }
  static void Main(string [] args)
  {
    RunTaskDelegate runTask = new RunTaskDelegate(RunTask);
    // 异步调用执行任务的委托
    runTask.BeginInvoke(20, null, null);
  }

实例2:测试多线程的实现方式——异步,线程ID测试

using System;
using 
System.Threading;
using 
System.Runtime.Remoting.Messaging;

namespace 
ProcessTest
{
class 
Program
{
//异步调用执行完成同步信号

static AutoResetEvent ev = new AutoResetEvent(false);
//定义委托

public delegate int Deleg(int a, int b);

static int WriteSum(int a, int 
b)
{
//显示当前线程ID号及Sum值

Console.WriteLine("执行WriteSum的线程ID为:{0},Sum = {1}", Thread.CurrentThread.ManagedThreadId, a + b);
return a + 
b;
}

//回调函数

static void SumDone(IAsyncResult async)
{
//等待1秒,模拟线程正在执行其他工作

Thread.Sleep(1000);

//
async中包装了异步方法执行的结果
//从操作结果async中还原委托

Deleg proc = ((AsyncResult)async).AsyncDelegate as Deleg;
//获取异步方法的执行结果

int sum = proc.EndInvoke(async);

//显示结果

Console.WriteLine("执行SumDone的线程ID为:{0},Sum = {1}", Thread.CurrentThread.ManagedThreadId, sum);

//
使用AsnycState属性获取主线程中传入的同步信号
//释放同步信号表示异步调用已完成

((AutoResetEvent)async.AsyncState).Set();


}

static void Main(string
[] args)
{
//创建一个委托

Deleg proc = new Deleg(WriteSum);

//
采用异步方式调用委托
//
指定SumDone为异步操作完成后的回调函数
//指定ev为object参数,用于同步回调函数与主线程间操作

IAsyncResult async = proc.BeginInvoke(10, 10, SumDone, ev);
Console.WriteLine(
"主线程ID号为:{0},异步操作已开始执行,正等待操作完成。"
, Thread.CurrentThread.ManagedThreadId);

//等待异步操作完成

ev.WaitOne();
Console.WriteLine(
"异步操作已完成!"
);

System.Console.ReadKey();
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,可以使用多线程来实现异步加载。一种常见的方法是使用Thread类创建子线程,并在子线程中执行需要异步加载的任务。可以通过ThreadStart委托将要执行的方法与新线程对象关联起来。例如,在FrmQC111_Load方法中,可以创建一个新的线程load,并将loadpage方法与该线程关联起来。loadpage方法中使用Action委托与具体的方法Bindt进行绑定,并使用BeginInvoke方法进行异步调用。Bindt方法用于实现加载控件数据源的操作。[1] 另一种常见的方法是使用Task类来执行异步任务。在.NET 4.0及以上版本中,可以使用Task类来实现异步操作。Task类提供了一种更方便的方式来执行异步任务,并且可以提高程序的运行效率。在.NET 5.0中,还引入了async/await关键字,使得异步编程更加方便。[2] 下面是两种方法的示例代码: 使用Thread类: ```csharp private void FrmQC111_Load(object sender, EventArgs e) { Thread load = new Thread(new ThreadStart(loadpage)); load.Start(); } private void loadpage() { // 执行异步加载的操作 Bindt(); } private void Bindt() { // 实现具体的加载操作 // ... } ``` 使用Task类: ```csharp private async void FrmQC111_Load(object sender, EventArgs e) { await Task.Run(() => Bindt()); } private void Bindt() { // 实现具体的加载操作 // ... } ``` 以上是两种常见的在C#中实现多线程异步加载的方法。具体选择哪种方法取决于你的需求和编程习惯。[3]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值