C# 如何将回调字符串用于mainform

C# 如何将回调字符串用于mainform,c#,.net,C#,.net,我有一个用c写的方法 class TorrentDownload { private readonly Thread _getstateThread; public Sohadownload() { _getstateThread = new Thread(GetState); _getstateThread.Start(); } TorrentHandle handle=null;

我有一个用c写的方法

class TorrentDownload
{
    private readonly Thread _getstateThread;        
    public Sohadownload() {
        _getstateThread = new Thread(GetState);
        _getstateThread.Start();            
    }

    TorrentHandle handle=null;
    public void Start(AddTorrentParams param)
    {
        var _session = new Session();            
        if (_session == null) throw new ArgumentNullException("sesion");
        _session.ListenOn(6881, 6889);
        handle = _session.AddTorrent(param);                                 
    }

        public void GetState(){
        while (true)
        {
            if (handle == null)
            {
                Thread.Sleep(1000);
                continue;
            }
            var status = handle.GetStatus();
            if (status.IsSeeding)
            {
                break;
            }                
            string _state = status.State.ToString();
            double _up = status.UploadRate;
            double _down = status.DownloadRate;
            double _process = status.Progress;
            Thread.Sleep(1000);
            //Console.WriteLine("State {0} Process {1}", _state, _process);            
       }
    }        
}
现在在主程序中,我只想调用_state中的值,_up,_dơn,_进程变量来显示在Console.Writeline中 我正在尝试使用委托,但它不起作用


请帮助我,谢谢。

根据您的要求,这里有一个想法

构造一个将管理状态并公开属性的类,以使您能够访问变量值

您可以从主函数调用GetState,然后访问_state、_up、_down、_process的值

如果需要,可以将属性和方法以及类设置为静态,但下面是示例代码:

public class ManageStatus
{
    private string _state;
    private double _up,_down,_process;

    public string State
    {
        get{ return _state;}
        set{ _state=value;}
    }
    public string State
    {
        get{ return _state;}
        set{ _state=value;}
    }
    public double Up
    {
        get{ return _up;}
        set{ _up=value;}
    }
    public double Down
    {
        get{ return _down;}
        set{ _down=value;}
    }
    public double Process
    {
        get{ return _process;}
        set{ _process=value;}
    }
    public void GetState()
    {
        while (true)
        {
            if (handle == null)
            {
                Thread.Sleep(1000);
                continue;
            }
            var status = handle.GetStatus();
            if (status.IsSeeding)
            {
                break;
            }                
            _state = status.State.ToString();
            _up = status.UploadRate;
            _down = status.DownloadRate;
            _process = status.Progress;
            Thread.Sleep(1000);
         }  
    }
}
在主代码中,您可以这样做

public static void Main()
{
     var status=new ManageStatus();
     status.GetState();
     Console.Writline("State:{0}",status.State);
     Console.Writline("Up:{0}",status.Up);
     Console.Writline("Down:{0}",status.Down);
     Console.Writline("Process:{0}",status.Process);
}

希望这将有助于您

您可以在GetState中而不是在Main中打印该行:


除了我的另一个答案之外,您还可以修改GetState并将循环移动到Main:

当然,这个Main没有太多功能,在GetState返回之前会被阻塞,但是考虑到我们对您的程序不太了解,我认为它是一个不错的例子


我还假设handle.GetStatus不返回null。

这看起来像轮询。你必须更加具体和明确。到底是什么不起作用?代表的电话是什么?在您的帖子中看不到任何代理,请使用正确的标记:winforms、threading等…感谢您的帮助。我尝试使用委托,它完成了。谢谢回复。我的目的是想将while循环中变量的值用于CommanLineHanks中显示的另一种方法。为了帮助我,我尝试了您的方法和示例代码。但我不工作。在主程序控制台WriteLine中,不打印任何内容。我在没有WHILE循环的情况下尝试您的方法,它工作正常。但我的程序需要在WHILE循环中运行才能下载数据,所以如何才能解决这个问题呢?非常感谢。这是我的全部代码。如果我把conssol.WriteLine放到While循环中,它就完成了。但我想知道如何在While循环中随时使用变量值的其他方法或函数
public void GetState() 
{ 
    while (true)
    {

        if (handle == null)
        {
            Thread.Sleep(1000);
            continue;
        }

        var status = handle.GetStatus();

        if (status.IsSeeding)
        {
            break;
        }

        Console.WriteLine("State: {0}, Up: {1}, Down: {2}, Process: {3}",
                          status.State.ToString(),
                          status.UploadRate,
                          status.DownloadRate,
                          status.Progress);

        Thread.Sleep(1000);
    }  
}
// N.B: I don't know where you get handle from,
//      I'll just adapt the code you've posted for simplicity
public WhateverTypeStatusIs GetState()
{
    if (handle == null)
    {
        Thread.Sleep(1000);
        continue;
    }
    var status = handle.GetStatus();
    if (status.IsSeeding)
    {
        break;
    }                

    return status;
}

public static void Main()
{
    while (true)
    {
        var status = GetState();

        if (status.IsSeeding)
        {
            break;
        }

        Console.WriteLine("State: {0}, Up: {1}, Down: {2}, Process: {3}",
                          status.State.ToString(),
                          status.UploadRate,
                          status.DownloadRate,
                          status.Progress);

        Thread.Sleep(1000);
    }
}