C# 使用未定义的变量,如何从另一个线程返回位图?

C# 使用未定义的变量,如何从另一个线程返回位图?,c#,multithreading,bitmap,C#,Multithreading,Bitmap,我制作了这个脚本来下载图像,但为了提高GUI响应能力,我想创建一个新线程,但是如何将位图返回到GUI线程 我的代码: try { Bitmap bit; var t = new Thread((ThreadStart)(() => { string picUri = ""; if (ONLINE_MODE_CHKBOX.

我制作了这个脚本来下载图像,但为了提高GUI响应能力,我想创建一个新线程,但是如何将位图返回到GUI线程

我的代码:

        try
        {
            Bitmap bit;

            var t = new Thread((ThreadStart)(() =>
            {
                string picUri = "";

                if (ONLINE_MODE_CHKBOX.Checked)
                {
                    picUri = "http://minecraft.aggenkeech.com/body.php?u=" + GetSessionId(true) + "&s=128&r=255&g=250&b=238";
                }
                else
                    picUri = "http://minecraft.aggenkeech.com/body.php?u=%USERNAME%&s=128&r=255&g=250&b=238";


                picUri = picUri.Replace("%USERNAME%", USERNAME_TXT.Text);

                // Create the requests.
                WebRequest requestPic = WebRequest.Create(picUri);

                WebResponse responsePic = requestPic.GetResponse();

                Image webImage = Image.FromStream(responsePic.GetResponseStream());

                Color red = Color.FromArgb(255, 255, 250, 238);

                bit = new Bitmap(webImage);

                bit.MakeTransparent(red);
            }));
            t.Start();

            SKIN_PICTURE_BOX.Image = bit; //<<<< Here it returns an error : Error, Use of unasigned local variable 'bit'

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
试试看
{
位图位;
var t=新线程((线程开始)(()=>
{
字符串picUri=“”;
如果(在线模式检查)
{
皮库里=”http://minecraft.aggenkeech.com/body.php?u=“+GetSessionId(true)+”&s=128&r=255&g=250&b=238”;
}
其他的
皮库里=”http://minecraft.aggenkeech.com/body.php?u=%USERNAME%&s=128&r=255&g=250&b=238";
picUri=picUri.Replace(“%USERNAME%”,USERNAME_TXT.Text);
//创建请求。
WebRequest requestPic=WebRequest.Create(picUri);
WebResponse responsePic=requestPic.GetResponse();
Image webImage=Image.FromStream(responsePic.GetResponseStream());
红色=颜色。来自argb(255、255、250、238);
位=新位图(webImage);
使透明(红色);
}));
t、 Start();

SKIN\u PICTURE\u BOX.Image=bit;//您可以定义一个公共事件并从线程调用该事件,您可以阅读更多关于如何添加/使用事件的内容

public委托void GetBitMapDelegate(位图位);
公共事件GetBitMapDelegate GetBitMap;
//你的方法
尝试
{
位图位;
var t=新线程((线程开始)(()=>
{
字符串picUri=“”;
如果(在线模式检查)
{
皮库里=”http://minecraft.aggenkeech.com/body.php?u=“+GetSessionId(true)+”&s=128&r=255&g=250&b=238”;
}
其他的
皮库里=”http://minecraft.aggenkeech.com/body.php?u=%USERNAME%&s=128&r=255&g=250&b=238";
picUri=picUri.Replace(“%USERNAME%”,USERNAME_TXT.Text);
//创建请求。
WebRequest requestPic=WebRequest.Create(picUri);
WebResponse responsePic=requestPic.GetResponse();
Image webImage=Image.FromStream(responsePic.GetResponseStream());
红色=颜色。来自argb(255、255、250、238);
位=新位图(webImage);
使透明(红色);
获取位图(位);
}));
t、 Start();

SKIN\u PICTURE\u BOX.Image=bit;//如果您使用的是.Net 4.5,您可以使用
async/wait
,这可以让您的生活更轻松。(不需要事件、委托、“调用”等)


异步任务GetImageAsync(字符串url) { 使用(var client=new HttpClient()) { var bmp=(位图)Bitmap.FromStream(wait client.GetStreamAsync(url)); 颜色透明=Color.FromArgb(255、255、250、238); bmp.MakeTransparent(透明); 返回bmp; } }
您是否尝试过简单地设置
位图位=null;
是的,位图不会加载到图片框中。在线程完成工作之前,您会立即将图像设置为SKIN_picture_BOX。因此它为null。
async/await
可以在这里提供帮助。因此,我应该首先让它等待线程退出?@Nobleleader13245使用
async/await
或回调机制。(不要忙着等待)您需要在窗体类上使用该事件,因为该事件未被使用,所以您得到了异常。我猜,@Nobleleader13245的下一个异常将是跨线程操作对于跨线程异常,您可以关注此帖子,@Nobleleader13245,我在这里找到了关于事件的好文章,@Adil谢谢,我很快就会研究它
public delegate void GetBitMapDelegate(Bitmap bit);
public event GetBitMapDelegate GetBitMap;

//Your method
try
{
    Bitmap bit;

    var t = new Thread((ThreadStart)(() =>
    {
        string picUri = "";

        if (ONLINE_MODE_CHKBOX.Checked)
        {
            picUri = "http://minecraft.aggenkeech.com/body.php?u=" + GetSessionId(true) + "&s=128&r=255&g=250&b=238";
        }
        else
            picUri = "http://minecraft.aggenkeech.com/body.php?u=%USERNAME%&s=128&r=255&g=250&b=238";


        picUri = picUri.Replace("%USERNAME%", USERNAME_TXT.Text);

        // Create the requests.
        WebRequest requestPic = WebRequest.Create(picUri);

        WebResponse responsePic = requestPic.GetResponse();

        Image webImage = Image.FromStream(responsePic.GetResponseStream());

        Color red = Color.FromArgb(255, 255, 250, 238);

        bit = new Bitmap(webImage);

        bit.MakeTransparent(red);
        GetBitMap(bit);
    }));
    t.Start();

    SKIN_PICTURE_BOX.Image = bit; //<<<< Here it returns an error : Error, Use of unasigned local variable 'bit'

}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
this.BackgroundImage = await GetImageAsync("http://......");
async Task<Image> GetImageAsync(string url)
{
    using (var client = new HttpClient())
    {
        var bmp = (Bitmap)Bitmap.FromStream(await client.GetStreamAsync(url));

        Color transparent = Color.FromArgb(255, 255, 250, 238);
        bmp.MakeTransparent(transparent);

        return bmp;
    }
}